Title: [291800] trunk
Revision
291800
Author
cdu...@apple.com
Date
2022-03-24 09:55:40 -0700 (Thu, 24 Mar 2022)

Log Message

String's find() / reverseFind() / replace() should take in a StringView instead of a String
https://bugs.webkit.org/show_bug.cgi?id=238287

Reviewed by Darin Adler.

Source/WebCore:

* Modules/indexeddb/server/SQLiteIDBBackingStore.cpp:
(WebCore::IDBServer::SQLiteIDBBackingStore::decodeDatabaseName):
* html/HTMLTextAreaElement.cpp:
(WebCore::HTMLTextAreaElement::setValueCommon):
* page/UserContentURLPattern.cpp:
(WebCore::UserContentURLPattern::parse):
* platform/mediastream/CaptureDevice.h:
(WebCore::CaptureDevice::label const):

Source/WebKit:

* WebProcess/WebCoreSupport/WebContextMenuClient.cpp:
(WebKit::WebContextMenuClient::searchWithGoogle):

Source/WebKitLegacy/win:

* WebCoreSupport/WebContextMenuClient.cpp:
(WebContextMenuClient::searchWithGoogle):

Source/WTF:

String's find() / reverseFind() / replace() should take in a StringView instead of a String
to avoid unnecessary String construction in many cases. We should probably do the same for
more String functions where we don't really need a String parameter, but those will be
addressed separately.

* wtf/text/AtomString.h:
* wtf/text/StringCommon.h:
(WTF::findCommon): Deleted.
* wtf/text/StringImpl.cpp:
(WTF::StringImpl::find):
(WTF::StringImpl::findIgnoringASCIICase const):
(WTF::StringImpl::reverseFind):
(WTF::StringImpl::replace):
* wtf/text/StringImpl.h:
* wtf/text/StringView.h:
(WTF::findCommon):
(WTF::findIgnoringASCIICase):
(WTF::String::find const):
(WTF::String::findIgnoringASCIICase const):
(WTF::String::reverseFind const):
(WTF::String::contains const):
(WTF::String::containsIgnoringASCIICase const):
(WTF::String::replace):
(WTF::AtomString::find const):
(WTF::AtomString::findIgnoringASCIICase const):
(WTF::AtomString::contains const):
(WTF::AtomString::containsIgnoringASCIICase const):
* wtf/text/WTFString.h:

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/API/JSValue.mm (291799 => 291800)


--- trunk/Source/_javascript_Core/API/JSValue.mm	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/_javascript_Core/API/JSValue.mm	2022-03-24 16:55:40 UTC (rev 291800)
@@ -1179,7 +1179,7 @@
             return;
         // Try to find a matching valueWith<Foo>:context: method.
         auto type = adoptSystem<char[]>(method_copyReturnType(method));
-        StructHandlers::iterator iter = structHandlers->find(String { type.get() });
+        StructHandlers::iterator iter = structHandlers->find(type.get());
         if (iter == structHandlers->end())
             return;
         StructTagHandler& handler = iter->value;
@@ -1217,7 +1217,7 @@
 
     static StructHandlers* structHandlers = createStructHandlerMap();
 
-    StructHandlers::iterator iter = structHandlers->find(String { encodedType });
+    StructHandlers::iterator iter = structHandlers->find(encodedType);
     if (iter == structHandlers->end())
         return 0;
     return &iter->value;

Modified: trunk/Source/_javascript_Core/API/JSWrapperMap.mm (291799 => 291800)


--- trunk/Source/_javascript_Core/API/JSWrapperMap.mm	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/_javascript_Core/API/JSWrapperMap.mm	2022-03-24 16:55:40 UTC (rev 291800)
@@ -451,7 +451,7 @@
         forEachMethodInClass(currentClass, ^(Method method) {
             SEL selector = method_getName(method);
             const char* name = sel_getName(selector);
-            auto iter = initTable.find(String { name });
+            auto iter = initTable.find(name);
 
             if (iter == initTable.end())
                 return;

Modified: trunk/Source/_javascript_Core/inspector/agents/InspectorAuditAgent.cpp (291799 => 291800)


--- trunk/Source/_javascript_Core/inspector/agents/InspectorAuditAgent.cpp	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/_javascript_Core/inspector/agents/InspectorAuditAgent.cpp	2022-03-24 16:55:40 UTC (rev 291800)
@@ -92,7 +92,7 @@
     if (injectedScript.hasNoValue())
         return makeUnexpected(errorString);
 
-    auto functionString = makeString("(function(WebInspectorAudit) { \"use strict\"; return eval(`(", String { test }.replace('`', "\\`"_s), ")`)(WebInspectorAudit); })");
+    auto functionString = makeString("(function(WebInspectorAudit) { \"use strict\"; return eval(`(", String { test }.replace('`', "\\`"), ")`)(WebInspectorAudit); })");
 
     InjectedScript::ExecuteOptions options;
     options.objectGroup = "audit"_s;

Modified: trunk/Source/_javascript_Core/jit/ExecutableAllocator.cpp (291799 => 291800)


--- trunk/Source/_javascript_Core/jit/ExecutableAllocator.cpp	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/_javascript_Core/jit/ExecutableAllocator.cpp	2022-03-24 16:55:40 UTC (rev 291800)
@@ -1153,7 +1153,7 @@
         {
             if (fd == -1) {
                 String path { Options::dumpJITMemoryPath() };
-                path = path.replace("%pid"_s, String::number(getCurrentProcessID()));
+                path = path.replace("%pid", String::number(getCurrentProcessID()));
                 fd = open(FileSystem::fileSystemRepresentation(path).data(), O_CREAT | O_TRUNC | O_APPEND | O_WRONLY | O_EXLOCK | O_NONBLOCK, 0666);
                 RELEASE_ASSERT(fd != -1);
             }

Modified: trunk/Source/_javascript_Core/runtime/ExceptionHelpers.cpp (291799 => 291800)


--- trunk/Source/_javascript_Core/runtime/ExceptionHelpers.cpp	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/_javascript_Core/runtime/ExceptionHelpers.cpp	2022-03-24 16:55:40 UTC (rev 291800)
@@ -161,7 +161,7 @@
         return defaultApproximateSourceError(originalMessage, sourceText);
 
     ASSERT(occurrence == ErrorInstance::FoundExactSource);
-    auto notAFunctionIndex = originalMessage.reverseFind("is not a function"_s);
+    auto notAFunctionIndex = originalMessage.reverseFind("is not a function");
     RELEASE_ASSERT(notAFunctionIndex != notFound);
     StringView displayValue;
     if (originalMessage.is8Bit()) 
@@ -197,7 +197,7 @@
         return defaultApproximateSourceError(originalMessage, sourceText);
 
     ASSERT(occurrence == ErrorInstance::FoundExactSource);
-    auto inIndex = sourceText.reverseFind("in"_s);
+    auto inIndex = sourceText.reverseFind("in");
     if (inIndex == notFound) {
         // This should basically never happen, since JS code must use the literal
         // text "in" for the `in` operation. However, if we fail to find "in"
@@ -218,7 +218,7 @@
         return defaultApproximateSourceError(originalMessage, sourceText);
 
     ASSERT(occurrence == ErrorInstance::FoundExactSource);
-    auto instanceofIndex = sourceText.reverseFind("instanceof"_s);
+    auto instanceofIndex = sourceText.reverseFind("instanceof");
     // This can happen when Symbol.hasInstance function is directly called.
     if (instanceofIndex == notFound)
         return originalMessage;
@@ -246,7 +246,7 @@
     if (occurrence == ErrorInstance::FoundApproximateSource)
         return defaultApproximateSourceError(originalMessage, sourceText);
 
-    auto extendsIndex = sourceText.reverseFind("extends"_s);
+    auto extendsIndex = sourceText.reverseFind("extends");
     if (extendsIndex == notFound || sourceText.find("extends") != extendsIndex)
         return makeString(originalMessage, " (evaluating '", sourceText, "')");
 

Modified: trunk/Source/_javascript_Core/runtime/TypeProfiler.cpp (291799 => 291800)


--- trunk/Source/_javascript_Core/runtime/TypeProfiler.cpp	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/_javascript_Core/runtime/TypeProfiler.cpp	2022-03-24 16:55:40 UTC (rev 291800)
@@ -53,9 +53,9 @@
 
     dataLog("\t\t", location->m_globalVariableID == TypeProfilerReturnStatement ? "[Return Statement]" : "[Normal Statement]", "\n");
 
-    dataLog("\t\t#Local#\n\t\t", location->m_instructionTypeSet->dumpTypes().replace("\n"_s, "\n\t\t"_s), "\n");
+    dataLog("\t\t#Local#\n\t\t", location->m_instructionTypeSet->dumpTypes().replace("\n", "\n\t\t"), "\n");
     if (location->m_globalTypeSet)
-        dataLog("\t\t#Global#\n\t\t", location->m_globalTypeSet->dumpTypes().replace("\n"_s, "\n\t\t"_s), "\n");
+        dataLog("\t\t#Global#\n\t\t", location->m_globalTypeSet->dumpTypes().replace("\n", "\n\t\t"), "\n");
 }
 
 void TypeProfiler::insertNewLocation(TypeLocation* location)

Modified: trunk/Source/_javascript_Core/runtime/TypeSet.cpp (291799 => 291800)


--- trunk/Source/_javascript_Core/runtime/TypeSet.cpp	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/_javascript_Core/runtime/TypeSet.cpp	2022-03-24 16:55:40 UTC (rev 291800)
@@ -348,7 +348,7 @@
     builder.append(':');
     for (auto& key : m_fields) {
         String property = key.get();
-        property.replace(":"_s, "\\:"_s); // Ensure that hash({"foo:", "bar"}) != hash({"foo", ":bar"}) because we're using colons as a separator and colons are legal characters in field names in JS.
+        property.replace(":", "\\:"); // Ensure that hash({"foo:", "bar"}) != hash({"foo", ":bar"}) because we're using colons as a separator and colons are legal characters in field names in JS.
         builder.append(property);
     }
 

Modified: trunk/Source/_javascript_Core/tools/FunctionOverrides.cpp (291799 => 291800)


--- trunk/Source/_javascript_Core/tools/FunctionOverrides.cpp	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/_javascript_Core/tools/FunctionOverrides.cpp	2022-03-24 16:55:40 UTC (rev 291800)
@@ -130,7 +130,7 @@
     FunctionOverridesAssertScope assertScope;
     String origProviderStr = origCode.provider()->source().toString();
     unsigned origStart = origCode.startOffset();
-    unsigned origFunctionStart = origProviderStr.reverseFind("function"_s, origStart);
+    unsigned origFunctionStart = origProviderStr.reverseFind("function", origStart);
     unsigned origBraceStart = origProviderStr.find('{', origStart);
     unsigned headerLength = origBraceStart - origFunctionStart;
     String origHeader = origProviderStr.substring(origFunctionStart, headerLength);
@@ -147,8 +147,8 @@
     info.lineCount = 1; // Faking it. This doesn't really matter for now.
     info.startColumn = 1;
     info.endColumn = 1; // Faking it. This doesn't really matter for now.
-    info.parametersStartOffset = newProviderStr.find("(");
-    info.typeProfilingStartOffset = newProviderStr.find("{");
+    info.parametersStartOffset = newProviderStr.find('(');
+    info.typeProfilingStartOffset = newProviderStr.find('{');
     info.typeProfilingEndOffset = newProviderStr.length() - 1;
 
     info.sourceCode =

Modified: trunk/Source/WTF/ChangeLog (291799 => 291800)


--- trunk/Source/WTF/ChangeLog	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WTF/ChangeLog	2022-03-24 16:55:40 UTC (rev 291800)
@@ -1,3 +1,39 @@
+2022-03-24  Chris Dumez  <cdu...@apple.com>
+
+        String's find() / reverseFind() / replace() should take in a StringView instead of a String
+        https://bugs.webkit.org/show_bug.cgi?id=238287
+
+        Reviewed by Darin Adler.
+
+        String's find() / reverseFind() / replace() should take in a StringView instead of a String
+        to avoid unnecessary String construction in many cases. We should probably do the same for
+        more String functions where we don't really need a String parameter, but those will be
+        addressed separately.
+
+        * wtf/text/AtomString.h:
+        * wtf/text/StringCommon.h:
+        (WTF::findCommon): Deleted.
+        * wtf/text/StringImpl.cpp:
+        (WTF::StringImpl::find):
+        (WTF::StringImpl::findIgnoringASCIICase const):
+        (WTF::StringImpl::reverseFind):
+        (WTF::StringImpl::replace):
+        * wtf/text/StringImpl.h:
+        * wtf/text/StringView.h:
+        (WTF::findCommon):
+        (WTF::findIgnoringASCIICase):
+        (WTF::String::find const):
+        (WTF::String::findIgnoringASCIICase const):
+        (WTF::String::reverseFind const):
+        (WTF::String::contains const):
+        (WTF::String::containsIgnoringASCIICase const):
+        (WTF::String::replace):
+        (WTF::AtomString::find const):
+        (WTF::AtomString::findIgnoringASCIICase const):
+        (WTF::AtomString::contains const):
+        (WTF::AtomString::containsIgnoringASCIICase const):
+        * wtf/text/WTFString.h:
+
 2022-03-23  Chris Dumez  <cdu...@apple.com>
 
         Inline String(ASCIILiteral) constructor so the compiler can optimize out strlen()

Modified: trunk/Source/WTF/wtf/text/AtomString.h (291799 => 291800)


--- trunk/Source/WTF/wtf/text/AtomString.h	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WTF/wtf/text/AtomString.h	2022-03-24 16:55:40 UTC (rev 291800)
@@ -114,14 +114,14 @@
 
     bool contains(UChar character) const { return m_string.contains(character); }
     bool contains(const LChar* string) const { return m_string.contains(string); }
-    bool contains(const String& string) const { return m_string.contains(string); }
-    bool containsIgnoringASCIICase(const String& string) const { return m_string.containsIgnoringASCIICase(string); }
+    bool contains(StringView) const;
+    bool containsIgnoringASCIICase(StringView) const;
 
     size_t find(UChar character, unsigned start = 0) const { return m_string.find(character, start); }
     size_t find(const LChar* string, unsigned start = 0) const { return m_string.find(string, start); }
-    size_t find(const String& string, unsigned start = 0) const { return m_string.find(string, start); }
-    size_t findIgnoringASCIICase(const String& string) const { return m_string.findIgnoringASCIICase(string); }
-    size_t findIgnoringASCIICase(const String& string, unsigned startOffset) const { return m_string.findIgnoringASCIICase(string, startOffset); }
+    size_t find(StringView, unsigned start = 0) const;
+    size_t findIgnoringASCIICase(StringView) const;
+    size_t findIgnoringASCIICase(StringView, unsigned start) const;
     size_t find(CodeUnitMatchFunction matchFunction, unsigned start = 0) const { return m_string.find(matchFunction, start); }
 
     bool startsWith(const String& string) const { return m_string.startsWith(string); }

Modified: trunk/Source/WTF/wtf/text/StringCommon.h (291799 => 291800)


--- trunk/Source/WTF/wtf/text/StringCommon.h	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WTF/wtf/text/StringCommon.h	2022-03-24 16:55:40 UTC (rev 291800)
@@ -480,33 +480,6 @@
     return matchLength < searchLength ? findIgnoringASCIICase(source, matchCharacters, 0, searchLength, matchLength) : notFound;
 }
 
-template<typename StringClassA, typename StringClassB>
-size_t findIgnoringASCIICase(const StringClassA& source, const StringClassB& stringToFind, unsigned startOffset)
-{
-    unsigned sourceStringLength = source.length();
-    unsigned matchLength = stringToFind.length();
-    if (!matchLength)
-        return std::min(startOffset, sourceStringLength);
-
-    // Check startOffset & matchLength are in range.
-    if (startOffset > sourceStringLength)
-        return notFound;
-    unsigned searchLength = sourceStringLength - startOffset;
-    if (matchLength > searchLength)
-        return notFound;
-
-    if (source.is8Bit()) {
-        if (stringToFind.is8Bit())
-            return findIgnoringASCIICase(source.characters8(), stringToFind.characters8(), startOffset, searchLength, matchLength);
-        return findIgnoringASCIICase(source.characters8(), stringToFind.characters16(), startOffset, searchLength, matchLength);
-    }
-
-    if (stringToFind.is8Bit())
-        return findIgnoringASCIICase(source.characters16(), stringToFind.characters8(), startOffset, searchLength, matchLength);
-
-    return findIgnoringASCIICase(source.characters16(), stringToFind.characters16(), startOffset, searchLength, matchLength);
-}
-
 template <typename SearchCharacterType, typename MatchCharacterType>
 ALWAYS_INLINE static size_t findInner(const SearchCharacterType* searchCharacters, const MatchCharacterType* matchCharacters, unsigned index, unsigned searchLength, unsigned matchLength)
 {
@@ -559,39 +532,6 @@
     return find(characters, length, static_cast<LChar>(matchCharacter), index);
 }
 
-template<typename StringClass>
-size_t findCommon(const StringClass& haystack, const StringClass& needle, unsigned start)
-{
-    unsigned needleLength = needle.length();
-
-    if (needleLength == 1) {
-        if (haystack.is8Bit())
-            return WTF::find(haystack.characters8(), haystack.length(), needle[0], start);
-        return WTF::find(haystack.characters16(), haystack.length(), needle[0], start);
-    }
-
-    if (start > haystack.length())
-        return notFound;
-
-    if (!needleLength)
-        return start;
-
-    unsigned searchLength = haystack.length() - start;
-    if (needleLength > searchLength)
-        return notFound;
-
-    if (haystack.is8Bit()) {
-        if (needle.is8Bit())
-            return findInner(haystack.characters8() + start, needle.characters8(), start, searchLength, needleLength);
-        return findInner(haystack.characters8() + start, needle.characters16(), start, searchLength, needleLength);
-    }
-
-    if (needle.is8Bit())
-        return findInner(haystack.characters16() + start, needle.characters8(), start, searchLength, needleLength);
-
-    return findInner(haystack.characters16() + start, needle.characters16(), start, searchLength, needleLength);
-}
-
 // This is marked inline since it's mostly used in non-inline functions for each string type.
 // When used directly in code it's probably OK to be inline; maybe the loop will be unrolled.
 template<typename CharacterType> inline bool equalLettersIgnoringASCIICase(const CharacterType* characters, const char* lowercaseLetters, unsigned length)

Modified: trunk/Source/WTF/wtf/text/StringImpl.cpp (291799 => 291800)


--- trunk/Source/WTF/wtf/text/StringImpl.cpp	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WTF/wtf/text/StringImpl.cpp	2022-03-24 16:55:40 UTC (rev 291800)
@@ -842,7 +842,7 @@
     return WTF::find(characters16(), m_length, matchFunction, start);
 }
 
-size_t StringImpl::find(const LChar* matchString, unsigned index)
+size_t StringImpl::find(const LChar* matchString, unsigned start)
 {
     // Check for null or empty string to match against
     if (!matchString)
@@ -852,19 +852,19 @@
         CRASH();
     unsigned matchLength = matchStringLength;
     if (!matchLength)
-        return std::min(index, length());
+        return std::min(start, length());
 
     // Optimization 1: fast case for strings of length 1.
     if (matchLength == 1) {
         if (is8Bit())
-            return WTF::find(characters8(), length(), matchString[0], index);
-        return WTF::find(characters16(), length(), *matchString, index);
+            return WTF::find(characters8(), length(), matchString[0], start);
+        return WTF::find(characters16(), length(), *matchString, start);
     }
 
-    // Check index & matchLength are in range.
-    if (index > length())
+    // Check start & matchLength are in range.
+    if (start > length())
         return notFound;
-    unsigned searchLength = length() - index;
+    unsigned searchLength = length() - start;
     if (matchLength > searchLength)
         return notFound;
     // delta is the number of additional times to test; delta == 0 means test only once.
@@ -874,7 +874,7 @@
     // only call equal if the hashes match.
 
     if (is8Bit()) {
-        const LChar* searchCharacters = characters8() + index;
+        const LChar* searchCharacters = characters8() + start;
 
         unsigned searchHash = 0;
         unsigned matchHash = 0;
@@ -891,10 +891,10 @@
             searchHash -= searchCharacters[i];
             ++i;
         }
-        return index + i;
+        return start + i;
     }
 
-    const UChar* searchCharacters = characters16() + index;
+    const UChar* searchCharacters = characters16() + start;
 
     unsigned searchHash = 0;
     unsigned matchHash = 0;
@@ -911,26 +911,26 @@
         searchHash -= searchCharacters[i];
         ++i;
     }
-    return index + i;
+    return start + i;
 }
 
-size_t StringImpl::find(StringImpl* matchString)
+size_t StringImpl::find(StringView matchString)
 {
     // Check for null string to match against
     if (UNLIKELY(!matchString))
         return notFound;
-    unsigned matchLength = matchString->length();
+    unsigned matchLength = matchString.length();
 
     // Optimization 1: fast case for strings of length 1.
     if (matchLength == 1) {
         if (is8Bit()) {
-            if (matchString->is8Bit())
-                return WTF::find(characters8(), length(), matchString->characters8()[0]);
-            return WTF::find(characters8(), length(), matchString->characters16()[0]);
+            if (matchString.is8Bit())
+                return WTF::find(characters8(), length(), matchString.characters8()[0]);
+            return WTF::find(characters8(), length(), matchString.characters16()[0]);
         }
-        if (matchString->is8Bit())
-            return WTF::find(characters16(), length(), matchString->characters8()[0]);
-        return WTF::find(characters16(), length(), matchString->characters16()[0]);
+        if (matchString.is8Bit())
+            return WTF::find(characters16(), length(), matchString.characters8()[0]);
+        return WTF::find(characters16(), length(), matchString.characters16()[0]);
     }
 
     // Check matchLength is in range.
@@ -942,65 +942,55 @@
         return 0;
 
     if (is8Bit()) {
-        if (matchString->is8Bit())
-            return findInner(characters8(), matchString->characters8(), 0, length(), matchLength);
-        return findInner(characters8(), matchString->characters16(), 0, length(), matchLength);
+        if (matchString.is8Bit())
+            return findInner(characters8(), matchString.characters8(), 0, length(), matchLength);
+        return findInner(characters8(), matchString.characters16(), 0, length(), matchLength);
     }
 
-    if (matchString->is8Bit())
-        return findInner(characters16(), matchString->characters8(), 0, length(), matchLength);
+    if (matchString.is8Bit())
+        return findInner(characters16(), matchString.characters8(), 0, length(), matchLength);
 
-    return findInner(characters16(), matchString->characters16(), 0, length(), matchLength);
+    return findInner(characters16(), matchString.characters16(), 0, length(), matchLength);
 }
 
-size_t StringImpl::find(StringImpl* matchString, unsigned index)
+size_t StringImpl::find(StringView matchString, unsigned start)
 {
     // Check for null or empty string to match against
     if (UNLIKELY(!matchString))
         return notFound;
 
-    return findCommon(*this, *matchString, index);
+    return findCommon(StringView { *this }, matchString, start);
 }
 
-size_t StringImpl::findIgnoringASCIICase(const StringImpl& matchString) const
+size_t StringImpl::findIgnoringASCIICase(StringView matchString) const
 {
-    return ::WTF::findIgnoringASCIICase(*this, matchString, 0);
-}
-
-size_t StringImpl::findIgnoringASCIICase(const StringImpl& matchString, unsigned startOffset) const
-{
-    return ::WTF::findIgnoringASCIICase(*this, matchString, startOffset);
-}
-
-size_t StringImpl::findIgnoringASCIICase(const StringImpl* matchString) const
-{
     if (!matchString)
         return notFound;
-    return ::WTF::findIgnoringASCIICase(*this, *matchString, 0);
+    return ::WTF::findIgnoringASCIICase(*this, matchString, 0);
 }
 
-size_t StringImpl::findIgnoringASCIICase(const StringImpl* matchString, unsigned startOffset) const
+size_t StringImpl::findIgnoringASCIICase(StringView matchString, unsigned start) const
 {
     if (!matchString)
         return notFound;
-    return ::WTF::findIgnoringASCIICase(*this, *matchString, startOffset);
+    return ::WTF::findIgnoringASCIICase(*this, matchString, start);
 }
 
-size_t StringImpl::reverseFind(UChar character, unsigned index)
+size_t StringImpl::reverseFind(UChar character, unsigned start)
 {
     if (is8Bit())
-        return WTF::reverseFind(characters8(), m_length, character, index);
-    return WTF::reverseFind(characters16(), m_length, character, index);
+        return WTF::reverseFind(characters8(), m_length, character, start);
+    return WTF::reverseFind(characters16(), m_length, character, start);
 }
 
 template <typename SearchCharacterType, typename MatchCharacterType>
-ALWAYS_INLINE static size_t reverseFindInner(const SearchCharacterType* searchCharacters, const MatchCharacterType* matchCharacters, unsigned index, unsigned length, unsigned matchLength)
+ALWAYS_INLINE static size_t reverseFindInner(const SearchCharacterType* searchCharacters, const MatchCharacterType* matchCharacters, unsigned start, unsigned length, unsigned matchLength)
 {
     // Optimization: keep a running hash of the strings,
     // only call equal if the hashes match.
 
     // delta is the number of additional times to test; delta == 0 means test only once.
-    unsigned delta = std::min(index, length - matchLength);
+    unsigned delta = std::min(start, length - matchLength);
     
     unsigned searchHash = 0;
     unsigned matchHash = 0;
@@ -1020,66 +1010,66 @@
     return delta;
 }
 
-size_t StringImpl::reverseFind(StringImpl* matchString, unsigned index)
+size_t StringImpl::reverseFind(StringView matchString, unsigned start)
 {
     // Check for null or empty string to match against
     if (!matchString)
         return notFound;
-    unsigned matchLength = matchString->length();
+    unsigned matchLength = matchString.length();
     unsigned ourLength = length();
     if (!matchLength)
-        return std::min(index, ourLength);
+        return std::min(start, ourLength);
 
     // Optimization 1: fast case for strings of length 1.
     if (matchLength == 1) {
         if (is8Bit())
-            return WTF::reverseFind(characters8(), ourLength, (*matchString)[0], index);
-        return WTF::reverseFind(characters16(), ourLength, (*matchString)[0], index);
+            return WTF::reverseFind(characters8(), ourLength, matchString[0], start);
+        return WTF::reverseFind(characters16(), ourLength, matchString[0], start);
     }
 
-    // Check index & matchLength are in range.
+    // Check start & matchLength are in range.
     if (matchLength > ourLength)
         return notFound;
 
     if (is8Bit()) {
-        if (matchString->is8Bit())
-            return reverseFindInner(characters8(), matchString->characters8(), index, ourLength, matchLength);
-        return reverseFindInner(characters8(), matchString->characters16(), index, ourLength, matchLength);
+        if (matchString.is8Bit())
+            return reverseFindInner(characters8(), matchString.characters8(), start, ourLength, matchLength);
+        return reverseFindInner(characters8(), matchString.characters16(), start, ourLength, matchLength);
     }
     
-    if (matchString->is8Bit())
-        return reverseFindInner(characters16(), matchString->characters8(), index, ourLength, matchLength);
+    if (matchString.is8Bit())
+        return reverseFindInner(characters16(), matchString.characters8(), start, ourLength, matchLength);
 
-    return reverseFindInner(characters16(), matchString->characters16(), index, ourLength, matchLength);
+    return reverseFindInner(characters16(), matchString.characters16(), start, ourLength, matchLength);
 }
 
-ALWAYS_INLINE static bool equalInner(const StringImpl& string, unsigned startOffset, const char* matchString, unsigned matchLength)
+ALWAYS_INLINE static bool equalInner(const StringImpl& string, unsigned start, const char* matchString, unsigned matchLength)
 {
     ASSERT(matchLength <= string.length());
-    ASSERT(startOffset + matchLength <= string.length());
+    ASSERT(start + matchLength <= string.length());
 
     if (string.is8Bit())
-        return equal(string.characters8() + startOffset, reinterpret_cast<const LChar*>(matchString), matchLength);
-    return equal(string.characters16() + startOffset, reinterpret_cast<const LChar*>(matchString), matchLength);
+        return equal(string.characters8() + start, reinterpret_cast<const LChar*>(matchString), matchLength);
+    return equal(string.characters16() + start, reinterpret_cast<const LChar*>(matchString), matchLength);
 }
 
-ALWAYS_INLINE static bool equalInner(const StringImpl& string, unsigned startOffset, const StringImpl& matchString)
+ALWAYS_INLINE static bool equalInner(const StringImpl& string, unsigned start, const StringImpl& matchString)
 {
-    if (startOffset > string.length())
+    if (start > string.length())
         return false;
     if (matchString.length() > string.length())
         return false;
-    if (matchString.length() + startOffset > string.length())
+    if (matchString.length() + start > string.length())
         return false;
 
     if (string.is8Bit()) {
         if (matchString.is8Bit())
-            return equal(string.characters8() + startOffset, matchString.characters8(), matchString.length());
-        return equal(string.characters8() + startOffset, matchString.characters16(), matchString.length());
+            return equal(string.characters8() + start, matchString.characters8(), matchString.length());
+        return equal(string.characters8() + start, matchString.characters16(), matchString.length());
     }
     if (matchString.is8Bit())
-        return equal(string.characters16() + startOffset, matchString.characters8(), matchString.length());
-    return equal(string.characters16() + startOffset, matchString.characters16(), matchString.length());
+        return equal(string.characters16() + start, matchString.characters8(), matchString.length());
+    return equal(string.characters16() + start, matchString.characters16(), matchString.length());
 }
 
 bool StringImpl::startsWith(const StringImpl* string) const
@@ -1112,9 +1102,9 @@
     return matchLength <= length() && equalInner(*this, 0, matchString, matchLength);
 }
 
-bool StringImpl::hasInfixStartingAt(const StringImpl& matchString, unsigned startOffset) const
+bool StringImpl::hasInfixStartingAt(const StringImpl& matchString, unsigned start) const
 {
-    return equalInner(*this, startOffset, matchString);
+    return equalInner(*this, start, matchString);
 }
 
 bool StringImpl::endsWith(StringImpl* suffix)
@@ -1415,29 +1405,29 @@
     return newImpl;
 }
 
-Ref<StringImpl> StringImpl::replace(StringImpl* pattern, StringImpl* replacement)
+Ref<StringImpl> StringImpl::replace(StringView pattern, StringView replacement)
 {
     if (!pattern || !replacement)
         return *this;
 
-    unsigned patternLength = pattern->length();
+    unsigned patternLength = pattern.length();
     if (!patternLength)
         return *this;
-        
-    unsigned repStrLength = replacement->length();
+
+    unsigned repStrLength = replacement.length();
     size_t srcSegmentStart = 0;
     unsigned matchCount = 0;
-    
+
     // Count the matches.
     while ((srcSegmentStart = find(pattern, srcSegmentStart)) != notFound) {
         ++matchCount;
         srcSegmentStart += patternLength;
     }
-    
+
     // If we have 0 matches, we don't have to do any more work
     if (!matchCount)
         return *this;
-    
+
     unsigned newSize = m_length - matchCount * patternLength;
     if (repStrLength && matchCount > MaxLength / repStrLength)
         CRASH();
@@ -1447,7 +1437,7 @@
 
     newSize += matchCount * repStrLength;
 
-    
+
     // Construct the new data
     size_t srcSegmentEnd;
     unsigned srcSegmentLength;
@@ -1454,8 +1444,8 @@
     srcSegmentStart = 0;
     unsigned dstOffset = 0;
     bool srcIs8Bit = is8Bit();
-    bool replacementIs8Bit = replacement->is8Bit();
-    
+    bool replacementIs8Bit = replacement.is8Bit();
+
     // There are 4 cases:
     // 1. This and replacement are both 8 bit.
     // 2. This and replacement are both 16 bit.
@@ -1469,7 +1459,7 @@
             srcSegmentLength = srcSegmentEnd - srcSegmentStart;
             copyCharacters(data + dstOffset, m_data8 + srcSegmentStart, srcSegmentLength);
             dstOffset += srcSegmentLength;
-            copyCharacters(data + dstOffset, replacement->m_data8, repStrLength);
+            copyCharacters(data + dstOffset, replacement.characters8(), repStrLength);
             dstOffset += repStrLength;
             srcSegmentStart = srcSegmentEnd + patternLength;
         }
@@ -1496,10 +1486,10 @@
         dstOffset += srcSegmentLength;
         if (replacementIs8Bit) {
             // Cases 2 & 3.
-            copyCharacters(data + dstOffset, replacement->m_data8, repStrLength);
+            copyCharacters(data + dstOffset, replacement.characters8(), repStrLength);
         } else {
             // Case 4
-            copyCharacters(data + dstOffset, replacement->m_data16, repStrLength);
+            copyCharacters(data + dstOffset, replacement.characters16(), repStrLength);
         }
         dstOffset += repStrLength;
         srcSegmentStart = srcSegmentEnd + patternLength;

Modified: trunk/Source/WTF/wtf/text/StringImpl.h (291799 => 291800)


--- trunk/Source/WTF/wtf/text/StringImpl.h	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WTF/wtf/text/StringImpl.h	2022-03-24 16:55:40 UTC (rev 291800)
@@ -428,18 +428,15 @@
     size_t find(LChar character, unsigned start = 0);
     size_t find(char character, unsigned start = 0);
     size_t find(UChar character, unsigned start = 0);
-    WTF_EXPORT_PRIVATE size_t find(CodeUnitMatchFunction, unsigned index = 0);
-    WTF_EXPORT_PRIVATE size_t find(const LChar*, unsigned index = 0);
-    ALWAYS_INLINE size_t find(const char* string, unsigned index = 0) { return find(reinterpret_cast<const LChar*>(string), index); }
-    WTF_EXPORT_PRIVATE size_t find(StringImpl*);
-    WTF_EXPORT_PRIVATE size_t find(StringImpl*, unsigned index);
-    WTF_EXPORT_PRIVATE size_t findIgnoringASCIICase(const StringImpl&) const;
-    WTF_EXPORT_PRIVATE size_t findIgnoringASCIICase(const StringImpl&, unsigned startOffset) const;
-    WTF_EXPORT_PRIVATE size_t findIgnoringASCIICase(const StringImpl*) const;
-    WTF_EXPORT_PRIVATE size_t findIgnoringASCIICase(const StringImpl*, unsigned startOffset) const;
+    WTF_EXPORT_PRIVATE size_t find(CodeUnitMatchFunction, unsigned start = 0);
+    WTF_EXPORT_PRIVATE size_t find(const LChar*, unsigned start = 0);
+    WTF_EXPORT_PRIVATE size_t find(StringView);
+    WTF_EXPORT_PRIVATE size_t find(StringView, unsigned start);
+    WTF_EXPORT_PRIVATE size_t findIgnoringASCIICase(StringView) const;
+    WTF_EXPORT_PRIVATE size_t findIgnoringASCIICase(StringView, unsigned start) const;
 
-    WTF_EXPORT_PRIVATE size_t reverseFind(UChar, unsigned index = MaxLength);
-    WTF_EXPORT_PRIVATE size_t reverseFind(StringImpl*, unsigned index = MaxLength);
+    WTF_EXPORT_PRIVATE size_t reverseFind(UChar, unsigned start = MaxLength);
+    WTF_EXPORT_PRIVATE size_t reverseFind(StringView, unsigned start = MaxLength);
 
     WTF_EXPORT_PRIVATE bool startsWith(const StringImpl*) const;
     WTF_EXPORT_PRIVATE bool startsWith(const StringImpl&) const;
@@ -448,7 +445,7 @@
     WTF_EXPORT_PRIVATE bool startsWith(UChar) const;
     WTF_EXPORT_PRIVATE bool startsWith(const char*, unsigned matchLength) const;
     template<unsigned matchLength> bool startsWith(const char (&prefix)[matchLength]) const { return startsWith(prefix, matchLength - 1); }
-    WTF_EXPORT_PRIVATE bool hasInfixStartingAt(const StringImpl&, unsigned startOffset) const;
+    WTF_EXPORT_PRIVATE bool hasInfixStartingAt(const StringImpl&, unsigned start) const;
 
     WTF_EXPORT_PRIVATE bool endsWith(StringImpl*);
     WTF_EXPORT_PRIVATE bool endsWith(StringImpl&);
@@ -464,8 +461,8 @@
     ALWAYS_INLINE Ref<StringImpl> replace(UChar pattern, const char* replacement, unsigned replacementLength) { return replace(pattern, reinterpret_cast<const LChar*>(replacement), replacementLength); }
     WTF_EXPORT_PRIVATE Ref<StringImpl> replace(UChar, const LChar*, unsigned replacementLength);
     Ref<StringImpl> replace(UChar, const UChar*, unsigned replacementLength);
-    WTF_EXPORT_PRIVATE Ref<StringImpl> replace(StringImpl*, StringImpl*);
-    WTF_EXPORT_PRIVATE Ref<StringImpl> replace(unsigned index, unsigned length, StringImpl*);
+    WTF_EXPORT_PRIVATE Ref<StringImpl> replace(StringView, StringView);
+    WTF_EXPORT_PRIVATE Ref<StringImpl> replace(unsigned start, unsigned length, StringImpl*);
 
     WTF_EXPORT_PRIVATE UCharDirection defaultWritingDirection(bool* hasStrongDirectionality = nullptr);
 
@@ -592,12 +589,12 @@
 template<unsigned length> bool equalLettersIgnoringASCIICase(const StringImpl*, const char (&lowercaseLetters)[length]);
 
 template<typename CodeUnit, typename CodeUnitMatchFunction, std::enable_if_t<std::is_invocable_r_v<bool, CodeUnitMatchFunction, CodeUnit>>* = nullptr>
-size_t find(const CodeUnit*, unsigned length, CodeUnitMatchFunction&&, unsigned index = 0);
+size_t find(const CodeUnit*, unsigned length, CodeUnitMatchFunction&&, unsigned start = 0);
 
-template<typename CharacterType> size_t reverseFindLineTerminator(const CharacterType*, unsigned length, unsigned index = StringImpl::MaxLength);
-template<typename CharacterType> size_t reverseFind(const CharacterType*, unsigned length, CharacterType matchCharacter, unsigned index = StringImpl::MaxLength);
-size_t reverseFind(const UChar*, unsigned length, LChar matchCharacter, unsigned index = StringImpl::MaxLength);
-size_t reverseFind(const LChar*, unsigned length, UChar matchCharacter, unsigned index = StringImpl::MaxLength);
+template<typename CharacterType> size_t reverseFindLineTerminator(const CharacterType*, unsigned length, unsigned start = StringImpl::MaxLength);
+template<typename CharacterType> size_t reverseFind(const CharacterType*, unsigned length, CharacterType matchCharacter, unsigned start = StringImpl::MaxLength);
+size_t reverseFind(const UChar*, unsigned length, LChar matchCharacter, unsigned start = StringImpl::MaxLength);
+size_t reverseFind(const LChar*, unsigned length, UChar matchCharacter, unsigned start = StringImpl::MaxLength);
 
 template<size_t inlineCapacity> bool equalIgnoringNullity(const Vector<UChar, inlineCapacity>&, StringImpl*);
 
@@ -642,54 +639,54 @@
 }
 
 template<typename CodeUnit, typename CodeUnitMatchFunction, std::enable_if_t<std::is_invocable_r_v<bool, CodeUnitMatchFunction, CodeUnit>>*>
-inline size_t find(const CodeUnit* characters, unsigned length, CodeUnitMatchFunction&& matchFunction, unsigned index)
+inline size_t find(const CodeUnit* characters, unsigned length, CodeUnitMatchFunction&& matchFunction, unsigned start)
 {
-    while (index < length) {
-        if (matchFunction(characters[index]))
-            return index;
-        ++index;
+    while (start < length) {
+        if (matchFunction(characters[start]))
+            return start;
+        ++start;
     }
     return notFound;
 }
 
-template<typename CharacterType> inline size_t reverseFindLineTerminator(const CharacterType* characters, unsigned length, unsigned index)
+template<typename CharacterType> inline size_t reverseFindLineTerminator(const CharacterType* characters, unsigned length, unsigned start)
 {
     if (!length)
         return notFound;
-    if (index >= length)
-        index = length - 1;
-    auto character = characters[index];
+    if (start >= length)
+        start = length - 1;
+    auto character = characters[start];
     while (character != '\n' && character != '\r') {
-        if (!index--)
+        if (!start--)
             return notFound;
-        character = characters[index];
+        character = characters[start];
     }
-    return index;
+    return start;
 }
 
-template<typename CharacterType> inline size_t reverseFind(const CharacterType* characters, unsigned length, CharacterType matchCharacter, unsigned index)
+template<typename CharacterType> inline size_t reverseFind(const CharacterType* characters, unsigned length, CharacterType matchCharacter, unsigned start)
 {
     if (!length)
         return notFound;
-    if (index >= length)
-        index = length - 1;
-    while (characters[index] != matchCharacter) {
-        if (!index--)
+    if (start >= length)
+        start = length - 1;
+    while (characters[start] != matchCharacter) {
+        if (!start--)
             return notFound;
     }
-    return index;
+    return start;
 }
 
-ALWAYS_INLINE size_t reverseFind(const UChar* characters, unsigned length, LChar matchCharacter, unsigned index)
+ALWAYS_INLINE size_t reverseFind(const UChar* characters, unsigned length, LChar matchCharacter, unsigned start)
 {
-    return reverseFind(characters, length, static_cast<UChar>(matchCharacter), index);
+    return reverseFind(characters, length, static_cast<UChar>(matchCharacter), start);
 }
 
-inline size_t reverseFind(const LChar* characters, unsigned length, UChar matchCharacter, unsigned index)
+inline size_t reverseFind(const LChar* characters, unsigned length, UChar matchCharacter, unsigned start)
 {
     if (!isLatin1(matchCharacter))
         return notFound;
-    return reverseFind(characters, length, static_cast<LChar>(matchCharacter), index);
+    return reverseFind(characters, length, static_cast<LChar>(matchCharacter), start);
 }
 
 inline size_t StringImpl::find(LChar character, unsigned start)

Modified: trunk/Source/WTF/wtf/text/StringView.h (291799 => 291800)


--- trunk/Source/WTF/wtf/text/StringView.h	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WTF/wtf/text/StringView.h	2022-03-24 16:55:40 UTC (rev 291800)
@@ -145,7 +145,7 @@
     size_t reverseFind(UChar, unsigned index = std::numeric_limits<unsigned>::max()) const;
 
     WTF_EXPORT_PRIVATE size_t findIgnoringASCIICase(StringView) const;
-    WTF_EXPORT_PRIVATE size_t findIgnoringASCIICase(StringView, unsigned startOffset) const;
+    WTF_EXPORT_PRIVATE size_t findIgnoringASCIICase(StringView, unsigned start) const;
 
     WTF_EXPORT_PRIVATE String convertToASCIILowercase() const;
     WTF_EXPORT_PRIVATE String convertToASCIIUppercase() const;
@@ -158,7 +158,7 @@
     WTF_EXPORT_PRIVATE bool contains(const char*) const;
 
     WTF_EXPORT_PRIVATE bool containsIgnoringASCIICase(StringView) const;
-    WTF_EXPORT_PRIVATE bool containsIgnoringASCIICase(StringView, unsigned startOffset) const;
+    WTF_EXPORT_PRIVATE bool containsIgnoringASCIICase(StringView, unsigned start) const;
 
     template<bool isSpecialCharacter(UChar)> bool isAllSpecialCharacters() const;
 
@@ -606,11 +606,11 @@
     return WTF::find(characters16(), m_length, std::forward<CodeUnitMatchFunction>(matchFunction), start);
 }
 
-inline size_t StringView::reverseFind(UChar character, unsigned index) const
+inline size_t StringView::reverseFind(UChar character, unsigned start) const
 {
     if (is8Bit())
-        return WTF::reverseFind(characters8(), m_length, character, index);
-    return WTF::reverseFind(characters16(), m_length, character, index);
+        return WTF::reverseFind(characters8(), m_length, character, start);
+    return WTF::reverseFind(characters16(), m_length, character, start);
 }
 
 #if !CHECK_STRINGVIEW_LIFETIME
@@ -1099,6 +1099,142 @@
     return false;
 }
 
+inline size_t findCommon(StringView haystack, StringView needle, unsigned start)
+{
+    unsigned needleLength = needle.length();
+
+    if (needleLength == 1) {
+        if (haystack.is8Bit())
+            return WTF::find(haystack.characters8(), haystack.length(), needle[0], start);
+        return WTF::find(haystack.characters16(), haystack.length(), needle[0], start);
+    }
+
+    if (start > haystack.length())
+        return notFound;
+
+    if (!needleLength)
+        return start;
+
+    unsigned searchLength = haystack.length() - start;
+    if (needleLength > searchLength)
+        return notFound;
+
+    if (haystack.is8Bit()) {
+        if (needle.is8Bit())
+            return findInner(haystack.characters8() + start, needle.characters8(), start, searchLength, needleLength);
+        return findInner(haystack.characters8() + start, needle.characters16(), start, searchLength, needleLength);
+    }
+
+    if (needle.is8Bit())
+        return findInner(haystack.characters16() + start, needle.characters8(), start, searchLength, needleLength);
+
+    return findInner(haystack.characters16() + start, needle.characters16(), start, searchLength, needleLength);
+}
+
+inline size_t findIgnoringASCIICase(StringView source, StringView stringToFind, unsigned start)
+{
+    unsigned sourceStringLength = source.length();
+    unsigned matchLength = stringToFind.length();
+    if (!matchLength)
+        return std::min(start, sourceStringLength);
+
+    // Check start & matchLength are in range.
+    if (start > sourceStringLength)
+        return notFound;
+    unsigned searchLength = sourceStringLength - start;
+    if (matchLength > searchLength)
+        return notFound;
+
+    if (source.is8Bit()) {
+        if (stringToFind.is8Bit())
+            return findIgnoringASCIICase(source.characters8(), stringToFind.characters8(), start, searchLength, matchLength);
+        return findIgnoringASCIICase(source.characters8(), stringToFind.characters16(), start, searchLength, matchLength);
+    }
+
+    if (stringToFind.is8Bit())
+        return findIgnoringASCIICase(source.characters16(), stringToFind.characters8(), start, searchLength, matchLength);
+
+    return findIgnoringASCIICase(source.characters16(), stringToFind.characters16(), start, searchLength, matchLength);
+}
+
+inline size_t String::find(StringView string) const
+{
+    return m_impl ? m_impl->find(string) : notFound;
+}
+inline size_t String::find(StringView string, unsigned start) const
+{
+    return m_impl ? m_impl->find(string, start) : notFound;
+}
+
+inline size_t String::findIgnoringASCIICase(StringView string) const
+{
+    return m_impl ? m_impl->findIgnoringASCIICase(string) : notFound;
+}
+
+inline size_t String::findIgnoringASCIICase(StringView string, unsigned start) const
+{
+    return m_impl ? m_impl->findIgnoringASCIICase(string, start) : notFound;
+}
+
+inline size_t String::reverseFind(StringView string, unsigned start) const
+{
+    return m_impl ? m_impl->reverseFind(string, start) : notFound;
+}
+
+inline bool String::contains(StringView string) const
+{
+    return find(string) != notFound;
+}
+
+inline bool String::containsIgnoringASCIICase(StringView string) const
+{
+    return findIgnoringASCIICase(string) != notFound;
+}
+
+inline bool String::containsIgnoringASCIICase(StringView string, unsigned start) const
+{
+    return findIgnoringASCIICase(string, start) != notFound;
+}
+
+inline String& String::replace(StringView target, StringView replacement)
+{
+    if (m_impl)
+        m_impl = m_impl->replace(target, replacement);
+    return *this;
+}
+
+inline String& String::replace(unsigned start, unsigned length, const String& replacement)
+{
+    if (m_impl)
+        m_impl = m_impl->replace(start, length, replacement.impl());
+    return *this;
+}
+
+inline size_t AtomString::find(StringView string, unsigned start) const
+{
+    return m_string.find(string, start);
+}
+
+inline size_t AtomString::findIgnoringASCIICase(StringView string) const
+{
+    return m_string.findIgnoringASCIICase(string);
+}
+
+inline size_t AtomString::findIgnoringASCIICase(StringView string, unsigned start) const
+{
+    return m_string.findIgnoringASCIICase(string, start);
+}
+
+inline bool AtomString::contains(StringView string) const
+{
+    return m_string.contains(string);
+}
+
+inline bool AtomString::containsIgnoringASCIICase(StringView string) const
+{
+    return m_string.containsIgnoringASCIICase(string);
+}
+
 } // namespace WTF
 
 using WTF::append;

Modified: trunk/Source/WTF/wtf/text/WTFString.h (291799 => 291800)


--- trunk/Source/WTF/wtf/text/WTFString.h	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WTF/wtf/text/WTFString.h	2022-03-24 16:55:40 UTC (rev 291800)
@@ -159,18 +159,17 @@
     // Find a single character or string, also with match function & latin1 forms.
     size_t find(UChar character, unsigned start = 0) const { return m_impl ? m_impl->find(character, start) : notFound; }
 
-    size_t find(const String& string) const { return m_impl ? m_impl->find(string.impl()) : notFound; }
-    size_t find(const String& string, unsigned start) const { return m_impl ? m_impl->find(string.impl(), start) : notFound; }
-    size_t findIgnoringASCIICase(const String& string) const { return m_impl ? m_impl->findIgnoringASCIICase(string.impl()) : notFound; }
-    size_t findIgnoringASCIICase(const String& string, unsigned startOffset) const { return m_impl ? m_impl->findIgnoringASCIICase(string.impl(), startOffset) : notFound; }
+    size_t find(StringView) const;
+    size_t find(StringView, unsigned start) const;
+    size_t findIgnoringASCIICase(StringView) const;
+    size_t findIgnoringASCIICase(StringView, unsigned start) const;
 
     size_t find(CodeUnitMatchFunction matchFunction, unsigned start = 0) const { return m_impl ? m_impl->find(matchFunction, start) : notFound; }
     size_t find(const LChar* string, unsigned start = 0) const { return m_impl ? m_impl->find(string, start) : notFound; }
-    size_t find(const char* string, unsigned start = 0) const { return m_impl ? m_impl->find(string, start) : notFound; }
 
     // Find the last instance of a single character or string.
     size_t reverseFind(UChar character, unsigned start = MaxLength) const { return m_impl ? m_impl->reverseFind(character, start) : notFound; }
-    size_t reverseFind(const String& string, unsigned start = MaxLength) const { return m_impl ? m_impl->reverseFind(string.impl(), start) : notFound; }
+    size_t reverseFind(StringView, unsigned start = MaxLength) const;
 
     WTF_EXPORT_PRIVATE Vector<UChar> charactersWithNullTermination() const;
     WTF_EXPORT_PRIVATE Vector<UChar> charactersWithoutNullTermination() const;
@@ -179,15 +178,15 @@
 
     bool contains(UChar character) const { return find(character) != notFound; }
     bool contains(const LChar* string) const { return find(string) != notFound; }
-    bool contains(const String& string) const { return find(string) != notFound; }
-    bool containsIgnoringASCIICase(const String& string) const { return findIgnoringASCIICase(string) != notFound; }
-    bool containsIgnoringASCIICase(const String& string, unsigned startOffset) const { return findIgnoringASCIICase(string, startOffset) != notFound; }
+    bool contains(StringView) const;
+    bool containsIgnoringASCIICase(StringView) const;
+    bool containsIgnoringASCIICase(StringView, unsigned start) const;
 
     bool startsWith(const String& string) const { return m_impl ? m_impl->startsWith(string.impl()) : string.isEmpty(); }
     bool startsWithIgnoringASCIICase(const String& string) const { return m_impl ? m_impl->startsWithIgnoringASCIICase(string.impl()) : string.isEmpty(); }
     bool startsWith(UChar character) const { return m_impl && m_impl->startsWith(character); }
     template<unsigned matchLength> bool startsWith(const char (&prefix)[matchLength]) const { return m_impl ? m_impl->startsWith<matchLength>(prefix) : !matchLength; }
-    bool hasInfixStartingAt(const String& prefix, unsigned startOffset) const { return m_impl && prefix.impl() && m_impl->hasInfixStartingAt(*prefix.impl(), startOffset); }
+    bool hasInfixStartingAt(const String& prefix, unsigned start) const { return m_impl && prefix.impl() && m_impl->hasInfixStartingAt(*prefix.impl(), start); }
 
     bool endsWith(const String& string) const { return m_impl ? m_impl->endsWith(string.impl()) : string.isEmpty(); }
     bool endsWithIgnoringASCIICase(const String& string) const { return m_impl ? m_impl->endsWithIgnoringASCIICase(string.impl()) : string.isEmpty(); }
@@ -206,7 +205,7 @@
 
     String& replace(UChar target, UChar replacement);
     String& replace(UChar target, const String& replacement);
-    String& replace(const String& target, const String& replacement);
+    String& replace(StringView target, StringView replacement);
     String& replace(unsigned start, unsigned length, const String& replacement);
     template<unsigned characterCount> String& replaceWithLiteral(UChar target, const char (&replacement)[characterCount]);
 
@@ -507,20 +506,6 @@
     return *this;
 }
 
-inline String& String::replace(const String& target, const String& replacement)
-{
-    if (m_impl)
-        m_impl = m_impl->replace(target.impl(), replacement.impl());
-    return *this;
-}
-
-inline String& String::replace(unsigned start, unsigned length, const String& replacement)
-{
-    if (m_impl)
-        m_impl = m_impl->replace(start, length, replacement.impl());
-    return *this;
-}
-
 template<unsigned characterCount> ALWAYS_INLINE String& String::replaceWithLiteral(UChar target, const char (&characters)[characterCount])
 {
     if (m_impl)

Modified: trunk/Source/WebCore/ChangeLog (291799 => 291800)


--- trunk/Source/WebCore/ChangeLog	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WebCore/ChangeLog	2022-03-24 16:55:40 UTC (rev 291800)
@@ -1,3 +1,19 @@
+2022-03-24  Chris Dumez  <cdu...@apple.com>
+
+        String's find() / reverseFind() / replace() should take in a StringView instead of a String
+        https://bugs.webkit.org/show_bug.cgi?id=238287
+
+        Reviewed by Darin Adler.
+
+        * Modules/indexeddb/server/SQLiteIDBBackingStore.cpp:
+        (WebCore::IDBServer::SQLiteIDBBackingStore::decodeDatabaseName):
+        * html/HTMLTextAreaElement.cpp:
+        (WebCore::HTMLTextAreaElement::setValueCommon):
+        * page/UserContentURLPattern.cpp:
+        (WebCore::UserContentURLPattern::parse):
+        * platform/mediastream/CaptureDevice.h:
+        (WebCore::CaptureDevice::label const):
+
 2022-03-24  Alan Bujtas  <za...@apple.com>
 
         [LFC][IFC] Do not construct a TextRun for measuring a single whitespace when simplified content measuring can be used

Modified: trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp (291799 => 291800)


--- trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp	2022-03-24 16:55:40 UTC (rev 291800)
@@ -176,7 +176,7 @@
         if (!mimeType)
             return std::nullopt;
         if (equalIgnoringASCIICase(mimeType->type, "multipart") && equalIgnoringASCIICase(mimeType->subtype, "form-data")) {
-            auto iterator = mimeType->parameters.find("boundary"_s);
+            auto iterator = mimeType->parameters.find("boundary");
             if (iterator != mimeType->parameters.end())
                 return iterator->value;
         }

Modified: trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp (291799 => 291800)


--- trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp	2022-03-24 16:55:40 UTC (rev 291800)
@@ -928,7 +928,7 @@
         return emptyString();
 
     String name = encodedName;
-    name.replace("%2E"_s, "."_s);
+    name.replace("%2E", ".");
 
     return FileSystem::decodeFromFilename(name);
 }

Modified: trunk/Source/WebCore/PAL/pal/text/DecodeEscapeSequences.h (291799 => 291800)


--- trunk/Source/WebCore/PAL/pal/text/DecodeEscapeSequences.h	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WebCore/PAL/pal/text/DecodeEscapeSequences.h	2022-03-24 16:55:40 UTC (rev 291800)
@@ -39,7 +39,7 @@
 // See <http://en.wikipedia.org/wiki/Percent-encoding#Non-standard_implementations>.
 struct Unicode16BitEscapeSequence {
     enum { SequenceSize = 6 }; // e.g. %u26C4
-    static size_t findInString(StringView string, size_t startPosition) { return string.find(StringView("%u"), startPosition); }
+    static size_t findInString(StringView string, size_t startPosition) { return string.find("%u", startPosition); }
     static size_t findEndOfRun(StringView string, size_t startPosition, size_t endPosition)
     {
         size_t runEnd = startPosition;

Modified: trunk/Source/WebCore/PAL/pal/text/win/TextCodecWin.cpp (291799 => 291800)


--- trunk/Source/WebCore/PAL/pal/text/win/TextCodecWin.cpp	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WebCore/PAL/pal/text/win/TextCodecWin.cpp	2022-03-24 16:55:40 UTC (rev 291800)
@@ -105,7 +105,7 @@
             i = codePageCharsets().set(cpInfo.uiCodePage, name).iterator;
         }
         if (i != codePageCharsets().end()) {
-            HashMap<String, CharsetInfo>::iterator j = knownCharsets().find(String(i->value.data(), i->value.length()));
+            HashMap<String, CharsetInfo>::iterator j = knownCharsets().find(StringView { i->value.data(), i->value.length() });
             ASSERT(j != knownCharsets().end());
             CharsetInfo& info = j->value;
             info.m_name = i->value.data();

Modified: trunk/Source/WebCore/html/HTMLTextAreaElement.cpp (291799 => 291800)


--- trunk/Source/WebCore/html/HTMLTextAreaElement.cpp	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WebCore/html/HTMLTextAreaElement.cpp	2022-03-24 16:55:40 UTC (rev 291800)
@@ -395,7 +395,7 @@
     // Code elsewhere normalizes line endings added by the user via the keyboard or pasting.
     // We normalize line endings coming from _javascript_ here.
     String normalizedValue = newValue.isNull() ? emptyString() : newValue;
-    normalizedValue.replace("\r\n"_s, "\n"_s);
+    normalizedValue.replace("\r\n", "\n");
     normalizedValue.replace('\r', '\n');
 
     // Return early because we don't want to move the caret or trigger other side effects

Modified: trunk/Source/WebCore/page/UserContentURLPattern.cpp (291799 => 291800)


--- trunk/Source/WebCore/page/UserContentURLPattern.cpp	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WebCore/page/UserContentURLPattern.cpp	2022-03-24 16:55:40 UTC (rev 291800)
@@ -63,15 +63,15 @@
 
 bool UserContentURLPattern::parse(const String& pattern)
 {
-    static NeverDestroyed<const String> schemeSeparator(MAKE_STATIC_STRING_IMPL("://"));
+    static constexpr ASCIILiteral schemeSeparator = "://"_s;
 
-    size_t schemeEndPos = pattern.find(schemeSeparator);
+    size_t schemeEndPos = pattern.find(StringView { schemeSeparator });
     if (schemeEndPos == notFound)
         return false;
 
     m_scheme = pattern.left(schemeEndPos);
 
-    unsigned hostStartPos = schemeEndPos + schemeSeparator.get().length();
+    unsigned hostStartPos = schemeEndPos + schemeSeparator.length();
     if (hostStartPos >= pattern.length())
         return false;
 

Modified: trunk/Source/WebCore/platform/graphics/texmap/TextureMapperContextAttributes.cpp (291799 => 291800)


--- trunk/Source/WebCore/platform/graphics/texmap/TextureMapperContextAttributes.cpp	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WebCore/platform/graphics/texmap/TextureMapperContextAttributes.cpp	2022-03-24 16:55:40 UTC (rev 291800)
@@ -55,8 +55,8 @@
         attributes.isGLES2Compliant = true;
 
         String extensionsString(reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS)));
-        attributes.supportsNPOTTextures = extensionsString.contains("GL_OES_texture_npot"_s);
-        attributes.supportsUnpackSubimage = extensionsString.contains("GL_EXT_unpack_subimage"_s);
+        attributes.supportsNPOTTextures = extensionsString.contains("GL_OES_texture_npot");
+        attributes.supportsUnpackSubimage = extensionsString.contains("GL_EXT_unpack_subimage");
 #else
         attributes.isGLES2Compliant = false;
         attributes.supportsNPOTTextures = true;

Modified: trunk/Source/WebCore/platform/mediastream/CaptureDevice.h (291799 => 291800)


--- trunk/Source/WebCore/platform/mediastream/CaptureDevice.h	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WebCore/platform/mediastream/CaptureDevice.h	2022-03-24 16:55:40 UTC (rev 291800)
@@ -52,7 +52,7 @@
     {
         static NeverDestroyed<String> airPods(MAKE_STATIC_STRING_IMPL("AirPods"));
 
-        if ((m_type == DeviceType::Microphone || m_type == DeviceType::Speaker) && m_label.contains(airPods))
+        if ((m_type == DeviceType::Microphone || m_type == DeviceType::Speaker) && m_label.contains(airPods.get()))
             return airPods;
 
         return m_label;

Modified: trunk/Source/WebCore/platform/network/curl/AuthenticationChallengeCurl.cpp (291799 => 291800)


--- trunk/Source/WebCore/platform/network/curl/AuthenticationChallengeCurl.cpp	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WebCore/platform/network/curl/AuthenticationChallengeCurl.cpp	2022-03-24 16:55:40 UTC (rev 291800)
@@ -117,7 +117,7 @@
 
     String realm;
     auto authHeader = response.httpHeaderField(response.isUnauthorized() ? wwwAuthenticate : proxyAuthenticate);
-    auto realmPos = authHeader.findIgnoringASCIICase(realmString);
+    auto realmPos = authHeader.findIgnoringASCIICase(realmString.get());
     if (realmPos != notFound) {
         realm = authHeader.substring(realmPos + realmString.get().length());
         realm = realm.left(realm.find(','));

Modified: trunk/Source/WebCore/platform/network/curl/CurlCacheEntry.cpp (291799 => 291800)


--- trunk/Source/WebCore/platform/network/curl/CurlCacheEntry.cpp	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WebCore/platform/network/curl/CurlCacheEntry.cpp	2022-03-24 16:55:40 UTC (rev 291800)
@@ -166,7 +166,7 @@
     Vector<String>::const_iterator it = headerFields.begin();
     Vector<String>::const_iterator end = headerFields.end();
     while (it != end) {
-        size_t splitPosition = it->find(":");
+        size_t splitPosition = it->find(':');
         if (splitPosition != notFound)
             m_cachedResponse.setHTTPHeaderField(it->left(splitPosition), it->substring(splitPosition+1).stripWhiteSpace());
         ++it;

Modified: trunk/Source/WebCore/platform/network/curl/CurlMultipartHandle.cpp (291799 => 291800)


--- trunk/Source/WebCore/platform/network/curl/CurlMultipartHandle.cpp	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WebCore/platform/network/curl/CurlMultipartHandle.cpp	2022-03-24 16:55:40 UTC (rev 291800)
@@ -52,15 +52,15 @@
 std::optional<String> CurlMultipartHandle::extractBoundary(const CurlResponse& response)
 {
     for (auto header : response.headers) {
-        auto splitPosistion = header.find(":");
-        if (splitPosistion == notFound)
+        auto splitPosition = header.find(':');
+        if (splitPosition == notFound)
             continue;
 
-        auto key = header.left(splitPosistion).stripWhiteSpace();
+        auto key = header.left(splitPosition).stripWhiteSpace();
         if (!equalIgnoringASCIICase(key, "Content-Type"))
             continue;
 
-        auto contentType = header.substring(splitPosistion + 1).stripWhiteSpace();
+        auto contentType = header.substring(splitPosition + 1).stripWhiteSpace();
         auto mimeType = extractMIMETypeFromMediaType(contentType);
         if (!equalIgnoringASCIICase(mimeType, "multipart/x-mixed-replace"))
             continue;

Modified: trunk/Source/WebCore/platform/network/curl/CurlRequest.cpp (291799 => 291800)


--- trunk/Source/WebCore/platform/network/curl/CurlRequest.cpp	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WebCore/platform/network/curl/CurlRequest.cpp	2022-03-24 16:55:40 UTC (rev 291800)
@@ -536,7 +536,7 @@
             headerFields.remove(0);
 
         for (auto& header : headerFields) {
-            auto pos = header.find(":");
+            auto pos = header.find(':');
             if (pos != notFound) {
                 auto key = header.left(pos).stripWhiteSpace();
                 auto value = header.substring(pos + 1).stripWhiteSpace();

Modified: trunk/Source/WebDriver/WebDriverService.cpp (291799 => 291800)


--- trunk/Source/WebDriver/WebDriverService.cpp	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WebDriver/WebDriverService.cpp	2022-03-24 16:55:40 UTC (rev 291800)
@@ -116,7 +116,7 @@
 
 #if USE(INSPECTOR_SOCKET_SERVER)
     if (!targetString.isEmpty()) {
-        auto position = targetString.reverseFind(":"_s);
+        auto position = targetString.reverseFind(':');
         if (position != notFound) {
             m_targetAddress = targetString.left(position);
             m_targetPort = parseIntegerAllowingTrailingJunk<uint16_t>(StringView { targetString }.substring(position + 1)).value_or(0);
@@ -617,7 +617,7 @@
             if (!unhandledPromptBehavior || !deserializeUnhandledPromptBehavior(unhandledPromptBehavior))
                 return nullptr;
             result->setString(it->key, unhandledPromptBehavior);
-        } else if (it->key.find(":") != notFound) {
+        } else if (it->key.find(':') != notFound) {
             if (!platformValidateCapability(it->key, it->value))
                 return nullptr;
             result->setValue(it->key, it->value.copyRef());

Modified: trunk/Source/WebKit/ChangeLog (291799 => 291800)


--- trunk/Source/WebKit/ChangeLog	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WebKit/ChangeLog	2022-03-24 16:55:40 UTC (rev 291800)
@@ -1,3 +1,13 @@
+2022-03-24  Chris Dumez  <cdu...@apple.com>
+
+        String's find() / reverseFind() / replace() should take in a StringView instead of a String
+        https://bugs.webkit.org/show_bug.cgi?id=238287
+
+        Reviewed by Darin Adler.
+
+        * WebProcess/WebCoreSupport/WebContextMenuClient.cpp:
+        (WebKit::WebContextMenuClient::searchWithGoogle):
+
 2022-03-24  Adrian Perez de Castro  <ape...@igalia.com>
 
         [GTK] REGRESSION(r291613): Build broken with USE_GTK4 + ENABLE_ACCESSIBILITY

Modified: trunk/Source/WebKit/NetworkProcess/soup/NetworkProcessSoup.cpp (291799 => 291800)


--- trunk/Source/WebKit/NetworkProcess/soup/NetworkProcessSoup.cpp	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WebKit/NetworkProcess/soup/NetworkProcessSoup.cpp	2022-03-24 16:55:40 UTC (rev 291800)
@@ -55,7 +55,7 @@
     size_t languagesCount = languages.size();
 
     // Ignore "C" locale.
-    size_t cLocalePosition = languages.find("c");
+    size_t cLocalePosition = languages.find("c"_s);
     if (cLocalePosition != notFound)
         languagesCount--;
 

Modified: trunk/Source/WebKit/Shared/mac/AuxiliaryProcessMac.mm (291799 => 291800)


--- trunk/Source/WebKit/Shared/mac/AuxiliaryProcessMac.mm	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WebKit/Shared/mac/AuxiliaryProcessMac.mm	2022-03-24 16:55:40 UTC (rev 291800)
@@ -645,7 +645,7 @@
     auto userDirectorySuffix = parameters.extraInitializationData.find("user-directory-suffix");
     if (userDirectorySuffix != parameters.extraInitializationData.end()) {
         String suffix = userDirectorySuffix->value;
-        auto firstPathSeparator = suffix.find("/");
+        auto firstPathSeparator = suffix.find('/');
         if (firstPathSeparator != notFound)
             suffix.truncate(firstPathSeparator);
         return suffix;

Modified: trunk/Source/WebKit/WebProcess/WebCoreSupport/WebContextMenuClient.cpp (291799 => 291800)


--- trunk/Source/WebKit/WebProcess/WebCoreSupport/WebContextMenuClient.cpp	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WebKit/WebProcess/WebCoreSupport/WebContextMenuClient.cpp	2022-03-24 16:55:40 UTC (rev 291800)
@@ -61,7 +61,7 @@
     auto searchString = frame->editor().selectedText();
     searchString.stripWhiteSpace();
     searchString = encodeWithURLEscapeSequences(searchString);
-    searchString.replace("%20"_s, "+"_s);
+    searchString.replace("%20", "+");
     auto searchURL = URL { "https://www.google.com/search?q=" + searchString + "&ie=UTF-8&oe=UTF-8" };
 
     WebCore::UserGestureIndicator indicator { WebCore::ProcessingUserGesture };

Modified: trunk/Source/WebKitLegacy/win/ChangeLog (291799 => 291800)


--- trunk/Source/WebKitLegacy/win/ChangeLog	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WebKitLegacy/win/ChangeLog	2022-03-24 16:55:40 UTC (rev 291800)
@@ -1,3 +1,13 @@
+2022-03-24  Chris Dumez  <cdu...@apple.com>
+
+        String's find() / reverseFind() / replace() should take in a StringView instead of a String
+        https://bugs.webkit.org/show_bug.cgi?id=238287
+
+        Reviewed by Darin Adler.
+
+        * WebCoreSupport/WebContextMenuClient.cpp:
+        (WebContextMenuClient::searchWithGoogle):
+
 2022-03-04  Chris Dumez  <cdu...@apple.com>
 
         Home link on weather.gov is not working

Modified: trunk/Source/WebKitLegacy/win/WebCoreSupport/WebContextMenuClient.cpp (291799 => 291800)


--- trunk/Source/WebKitLegacy/win/WebCoreSupport/WebContextMenuClient.cpp	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Source/WebKitLegacy/win/WebCoreSupport/WebContextMenuClient.cpp	2022-03-24 16:55:40 UTC (rev 291800)
@@ -58,7 +58,7 @@
     auto searchString = frame->editor().selectedText();
     searchString.stripWhiteSpace();
     searchString = encodeWithURLEscapeSequences(searchString);
-    searchString.replace("%20"_s, "+"_s);
+    searchString.replace("%20", "+");
     auto searchURL = URL { "https://www.google.com/search?q=" + searchString + "&ie=UTF-8&oe=UTF-8" };
 
     WebCore::UserGestureIndicator indicator { WebCore::ProcessingUserGesture };

Modified: trunk/Tools/TestWebKitAPI/Tests/WTF/StringImpl.cpp (291799 => 291800)


--- trunk/Tools/TestWebKitAPI/Tests/WTF/StringImpl.cpp	2022-03-24 15:55:34 UTC (rev 291799)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/StringImpl.cpp	2022-03-24 16:55:40 UTC (rev 291800)
@@ -334,13 +334,13 @@
 TEST(WTF, StringImplFindIgnoringASCIICaseOnNull)
 {
     auto reference = stringFromUTF8("ABCÉEFG");
-    EXPECT_EQ(static_cast<size_t>(WTF::notFound), reference->findIgnoringASCIICase(nullptr));
-    EXPECT_EQ(static_cast<size_t>(WTF::notFound), reference->findIgnoringASCIICase(nullptr, 0));
-    EXPECT_EQ(static_cast<size_t>(WTF::notFound), reference->findIgnoringASCIICase(nullptr, 3));
-    EXPECT_EQ(static_cast<size_t>(WTF::notFound), reference->findIgnoringASCIICase(nullptr, 7));
-    EXPECT_EQ(static_cast<size_t>(WTF::notFound), reference->findIgnoringASCIICase(nullptr, 8));
-    EXPECT_EQ(static_cast<size_t>(WTF::notFound), reference->findIgnoringASCIICase(nullptr, 42));
-    EXPECT_EQ(static_cast<size_t>(WTF::notFound), reference->findIgnoringASCIICase(nullptr, std::numeric_limits<unsigned>::max()));
+    EXPECT_EQ(static_cast<size_t>(WTF::notFound), reference->findIgnoringASCIICase(StringView { }));
+    EXPECT_EQ(static_cast<size_t>(WTF::notFound), reference->findIgnoringASCIICase(StringView { }, 0));
+    EXPECT_EQ(static_cast<size_t>(WTF::notFound), reference->findIgnoringASCIICase(StringView { }, 3));
+    EXPECT_EQ(static_cast<size_t>(WTF::notFound), reference->findIgnoringASCIICase(StringView { }, 7));
+    EXPECT_EQ(static_cast<size_t>(WTF::notFound), reference->findIgnoringASCIICase(StringView { }, 8));
+    EXPECT_EQ(static_cast<size_t>(WTF::notFound), reference->findIgnoringASCIICase(StringView { }, 42));
+    EXPECT_EQ(static_cast<size_t>(WTF::notFound), reference->findIgnoringASCIICase(StringView { }, std::numeric_limits<unsigned>::max()));
 }
 
 TEST(WTF, StringImplFindIgnoringASCIICaseOnEmpty)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to