<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[210313] trunk</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/210313">210313</a></dd>
<dt>Author</dt> <dd>utatane.tea@gmail.com</dd>
<dt>Date</dt> <dd>2017-01-04 18:53:00 -0800 (Wed, 04 Jan 2017)</dd>
</dl>
<h3>Log Message</h3>
<pre>Limit thread name appropriately
https://bugs.webkit.org/show_bug.cgi?id=166676
Reviewed by Sam Weinig.
Source/WTF:
In some platform, the max length of thread names are limited.
For example, the number of the max length is 32 in Windows and
16 in Linux. But the specified thread name is typically long
in WebKit like "com.apple.CoreIPC.ReceiveQueue"
We port the logic substring the thread name in
generic/WorkQueueGeneric.cpp to Threading. It retrieves the name
"ReceiveQueue" from "com.apple.CoreIPC.ReceiveQueue". And apply
the appropriate the thread name limit and use it on Linux and
Windows environment.
* wtf/Threading.cpp:
(WTF::normalizeThreadName):
(WTF::createThread):
* wtf/Threading.h:
* wtf/ThreadingPthreads.cpp:
(WTF::initializeCurrentThreadInternal):
* wtf/ThreadingWin.cpp:
(WTF::initializeCurrentThreadInternal):
* wtf/generic/WorkQueueGeneric.cpp:
(WorkQueue::platformInitialize):
* wtf/text/StringView.h:
(WTF::StringView::left):
(WTF::StringView::right):
(WTF::StringView::reverseFind):
Tools:
* TestWebKitAPI/Tests/WTF/StringView.cpp:
(TestWebKitAPI::TEST):
* TestWebKitAPI/Tests/WTF/WTFString.cpp:
(TestWebKitAPI::TEST):</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfThreadingcpp">trunk/Source/WTF/wtf/Threading.cpp</a></li>
<li><a href="#trunkSourceWTFwtfThreadingh">trunk/Source/WTF/wtf/Threading.h</a></li>
<li><a href="#trunkSourceWTFwtfThreadingPthreadscpp">trunk/Source/WTF/wtf/ThreadingPthreads.cpp</a></li>
<li><a href="#trunkSourceWTFwtfThreadingWincpp">trunk/Source/WTF/wtf/ThreadingWin.cpp</a></li>
<li><a href="#trunkSourceWTFwtfgenericWorkQueueGenericcpp">trunk/Source/WTF/wtf/generic/WorkQueueGeneric.cpp</a></li>
<li><a href="#trunkSourceWTFwtftextStringViewh">trunk/Source/WTF/wtf/text/StringView.h</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWTFStringViewcpp">trunk/Tools/TestWebKitAPI/Tests/WTF/StringView.cpp</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWTFWTFStringcpp">trunk/Tools/TestWebKitAPI/Tests/WTF/WTFString.cpp</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (210312 => 210313)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2017-01-05 02:49:51 UTC (rev 210312)
+++ trunk/Source/WTF/ChangeLog        2017-01-05 02:53:00 UTC (rev 210313)
</span><span class="lines">@@ -1,3 +1,36 @@
</span><ins>+2017-01-04 Yusuke Suzuki <utatane.tea@gmail.com>
+
+ Limit thread name appropriately
+ https://bugs.webkit.org/show_bug.cgi?id=166676
+
+ Reviewed by Sam Weinig.
+
+ In some platform, the max length of thread names are limited.
+ For example, the number of the max length is 32 in Windows and
+ 16 in Linux. But the specified thread name is typically long
+ in WebKit like "com.apple.CoreIPC.ReceiveQueue"
+
+ We port the logic substring the thread name in
+ generic/WorkQueueGeneric.cpp to Threading. It retrieves the name
+ "ReceiveQueue" from "com.apple.CoreIPC.ReceiveQueue". And apply
+ the appropriate the thread name limit and use it on Linux and
+ Windows environment.
+
+ * wtf/Threading.cpp:
+ (WTF::normalizeThreadName):
+ (WTF::createThread):
+ * wtf/Threading.h:
+ * wtf/ThreadingPthreads.cpp:
+ (WTF::initializeCurrentThreadInternal):
+ * wtf/ThreadingWin.cpp:
+ (WTF::initializeCurrentThreadInternal):
+ * wtf/generic/WorkQueueGeneric.cpp:
+ (WorkQueue::platformInitialize):
+ * wtf/text/StringView.h:
+ (WTF::StringView::left):
+ (WTF::StringView::right):
+ (WTF::StringView::reverseFind):
+
</ins><span class="cx"> 2017-01-04 Sam Weinig <sam@webkit.org>
</span><span class="cx">
</span><span class="cx"> REGRESSION (r210257): com.apple.WebKit.WebContent.Development crashed in com.apple.WebCore: WebCore::ExceptionOr<WTF::Ref<WebCore::Database> >::operator= + 14
</span></span></pre></div>
<a id="trunkSourceWTFwtfThreadingcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/Threading.cpp (210312 => 210313)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/Threading.cpp        2017-01-05 02:49:51 UTC (rev 210312)
+++ trunk/Source/WTF/wtf/Threading.cpp        2017-01-05 02:53:00 UTC (rev 210313)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> #include <algorithm>
</span><span class="cx"> #include <cmath>
</span><span class="cx"> #include <cstring>
</span><ins>+#include <wtf/text/StringView.h>
</ins><span class="cx">
</span><span class="cx"> namespace WTF {
</span><span class="cx">
</span><span class="lines">@@ -40,6 +41,33 @@
</span><span class="cx"> Mutex creationMutex;
</span><span class="cx"> };
</span><span class="cx">
</span><ins>+const char* normalizeThreadName(const char* threadName)
+{
+#if HAVE(PTHREAD_SETNAME_NP)
+ return threadName;
+#else
+ // This name can be com.apple.WebKit.ProcessLauncher or com.apple.CoreIPC.ReceiveQueue.
+ // We are using those names for the thread name, but both are longer than the limit of
+ // the platform thread name length, 32 for Windows and 16 for Linux.
+ StringView result(threadName);
+ size_t size = result.reverseFind('.');
+ if (size != notFound)
+ result = result.substring(size + 1);
+
+#if OS(WINDOWS)
+ constexpr const size_t kVisualStudioThreadNameLimit = 32 - 1;
+ if (result.length() > kVisualStudioThreadNameLimit)
+ result = result.right(kVisualStudioThreadNameLimit);
+#elif OS(LINUX)
+ constexpr const size_t kLinuxThreadNameLimit = 16 - 1;
+ if (result.length() > kLinuxThreadNameLimit)
+ result = result.right(kLinuxThreadNameLimit);
+#endif
+ ASSERT(result.characters8()[result.length()] == '\0');
+ return reinterpret_cast<const char*>(result.characters8());
+#endif
+}
+
</ins><span class="cx"> static void threadEntryPoint(void* contextData)
</span><span class="cx"> {
</span><span class="cx"> NewThreadContext* context = static_cast<NewThreadContext*>(contextData);
</span><span class="lines">@@ -62,13 +90,6 @@
</span><span class="cx">
</span><span class="cx"> ThreadIdentifier createThread(const char* name, std::function<void()> entryPoint)
</span><span class="cx"> {
</span><del>- // Visual Studio has a 31-character limit on thread names. Longer names will
- // be truncated silently, but we'd like callers to know about the limit.
-#if !LOG_DISABLED && PLATFORM(WIN)
- if (name && strlen(name) > 31)
- LOG_ERROR("Thread name \"%s\" is longer than 31 characters and will be truncated by Visual Studio", name);
-#endif
-
</del><span class="cx"> NewThreadContext* context = new NewThreadContext { name, WTFMove(entryPoint), { } };
</span><span class="cx">
</span><span class="cx"> // Prevent the thread body from executing until we've established the thread identifier.
</span></span></pre></div>
<a id="trunkSourceWTFwtfThreadingh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/Threading.h (210312 => 210313)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/Threading.h        2017-01-05 02:49:51 UTC (rev 210312)
+++ trunk/Source/WTF/wtf/Threading.h        2017-01-05 02:53:00 UTC (rev 210313)
</span><span class="lines">@@ -77,6 +77,8 @@
</span><span class="cx"> // Helpful for platforms where the thread name must be set from within the thread.
</span><span class="cx"> void initializeCurrentThreadInternal(const char* threadName);
</span><span class="cx">
</span><ins>+const char* normalizeThreadName(const char* threadName);
+
</ins><span class="cx"> } // namespace WTF
</span><span class="cx">
</span><span class="cx"> using WTF::ThreadIdentifier;
</span></span></pre></div>
<a id="trunkSourceWTFwtfThreadingPthreadscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/ThreadingPthreads.cpp (210312 => 210313)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/ThreadingPthreads.cpp        2017-01-05 02:49:51 UTC (rev 210312)
+++ trunk/Source/WTF/wtf/ThreadingPthreads.cpp        2017-01-05 02:53:00 UTC (rev 210313)
</span><span class="lines">@@ -195,9 +195,9 @@
</span><span class="cx"> void initializeCurrentThreadInternal(const char* threadName)
</span><span class="cx"> {
</span><span class="cx"> #if HAVE(PTHREAD_SETNAME_NP)
</span><del>- pthread_setname_np(threadName);
</del><ins>+ pthread_setname_np(normalizeThreadName(threadName));
</ins><span class="cx"> #elif OS(LINUX)
</span><del>- prctl(PR_SET_NAME, threadName);
</del><ins>+ prctl(PR_SET_NAME, normalizeThreadName(threadName));
</ins><span class="cx"> #else
</span><span class="cx"> UNUSED_PARAM(threadName);
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWTFwtfThreadingWincpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/ThreadingWin.cpp (210312 => 210313)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/ThreadingWin.cpp        2017-01-05 02:49:51 UTC (rev 210312)
+++ trunk/Source/WTF/wtf/ThreadingWin.cpp        2017-01-05 02:53:00 UTC (rev 210313)
</span><span class="lines">@@ -129,7 +129,7 @@
</span><span class="cx"> #else
</span><span class="cx"> THREADNAME_INFO info;
</span><span class="cx"> info.dwType = 0x1000;
</span><del>- info.szName = szThreadName;
</del><ins>+ info.szName = normalizeThreadName(szThreadName);
</ins><span class="cx"> info.dwThreadID = GetCurrentThreadId();
</span><span class="cx"> info.dwFlags = 0;
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWTFwtfgenericWorkQueueGenericcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/generic/WorkQueueGeneric.cpp (210312 => 210313)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/generic/WorkQueueGeneric.cpp        2017-01-05 02:49:51 UTC (rev 210312)
+++ trunk/Source/WTF/wtf/generic/WorkQueueGeneric.cpp        2017-01-05 02:53:00 UTC (rev 210313)
</span><span class="lines">@@ -32,24 +32,10 @@
</span><span class="cx">
</span><span class="cx"> #include <wtf/text/WTFString.h>
</span><span class="cx">
</span><del>-static const size_t kVisualStudioThreadNameLimit = 31;
-
</del><span class="cx"> void WorkQueue::platformInitialize(const char* name, Type, QOS)
</span><span class="cx"> {
</span><del>- // This name can be com.apple.WebKit.ProcessLauncher or com.apple.CoreIPC.ReceiveQueue.
- // We are using those names for the thread name, but both are longer than 31 characters,
- // which is the limit of Visual Studio for thread names.
- // When log is enabled createThread() will assert instead of truncate the name, so we need
- // to make sure we don't use a name longer than 31 characters.
- String threadName(name);
- size_t size = threadName.reverseFind('.');
- if (size != notFound)
- threadName = threadName.substring(size + 1);
- if (threadName.length() > kVisualStudioThreadNameLimit)
- threadName = threadName.right(kVisualStudioThreadNameLimit);
-
</del><span class="cx"> LockHolder locker(m_initializeRunLoopConditionMutex);
</span><del>- m_workQueueThread = createThread(threadName.ascii().data(), [this] {
</del><ins>+ m_workQueueThread = createThread(name, [this] {
</ins><span class="cx"> {
</span><span class="cx"> LockHolder locker(m_initializeRunLoopConditionMutex);
</span><span class="cx"> m_runLoop = &RunLoop::current();
</span></span></pre></div>
<a id="trunkSourceWTFwtftextStringViewh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/text/StringView.h (210312 => 210313)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/text/StringView.h        2017-01-05 02:49:51 UTC (rev 210312)
+++ trunk/Source/WTF/wtf/text/StringView.h        2017-01-05 02:53:00 UTC (rev 210313)
</span><span class="lines">@@ -23,9 +23,9 @@
</span><span class="cx"> * THE POSSIBILITY OF SUCH DAMAGE.
</span><span class="cx"> */
</span><span class="cx">
</span><del>-#ifndef StringView_h
-#define StringView_h
</del><ins>+#pragma once
</ins><span class="cx">
</span><ins>+#include <limits.h>
</ins><span class="cx"> #include <unicode/utypes.h>
</span><span class="cx"> #include <wtf/Forward.h>
</span><span class="cx"> #include <wtf/RetainPtr.h>
</span><span class="lines">@@ -114,6 +114,8 @@
</span><span class="cx"> void getCharactersWithUpconvert(UChar*) const;
</span><span class="cx">
</span><span class="cx"> StringView substring(unsigned start, unsigned length = std::numeric_limits<unsigned>::max()) const;
</span><ins>+ StringView left(unsigned len) const { return substring(0, len); }
+ StringView right(unsigned len) const { return substring(length() - len, len); }
</ins><span class="cx"> WTF_EXPORT_STRING_API Vector<StringView> split(UChar);
</span><span class="cx">
</span><span class="cx"> size_t find(UChar, unsigned start = 0) const;
</span><span class="lines">@@ -121,6 +123,8 @@
</span><span class="cx">
</span><span class="cx"> WTF_EXPORT_STRING_API size_t find(StringView, unsigned start) const;
</span><span class="cx">
</span><ins>+ size_t reverseFind(UChar, unsigned index = UINT_MAX) const;
+
</ins><span class="cx"> WTF_EXPORT_STRING_API size_t findIgnoringASCIICase(const StringView&) const;
</span><span class="cx"> WTF_EXPORT_STRING_API size_t findIgnoringASCIICase(const StringView&, unsigned startOffset) const;
</span><span class="cx">
</span><span class="lines">@@ -531,6 +535,13 @@
</span><span class="cx"> return WTF::find(characters16(), m_length, matchFunction, start);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+inline size_t StringView::reverseFind(UChar character, unsigned index) const
+{
+ if (is8Bit())
+ return WTF::reverseFind(characters8(), m_length, character, index);
+ return WTF::reverseFind(characters16(), m_length, character, index);
+}
+
</ins><span class="cx"> #if !CHECK_STRINGVIEW_LIFETIME
</span><span class="cx"> inline void StringView::invalidate(const StringImpl&)
</span><span class="cx"> {
</span><span class="lines">@@ -837,5 +848,3 @@
</span><span class="cx"> using WTF::append;
</span><span class="cx"> using WTF::equal;
</span><span class="cx"> using WTF::StringView;
</span><del>-
-#endif // StringView_h
</del></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (210312 => 210313)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2017-01-05 02:49:51 UTC (rev 210312)
+++ trunk/Tools/ChangeLog        2017-01-05 02:53:00 UTC (rev 210313)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2017-01-04 Yusuke Suzuki <utatane.tea@gmail.com>
+
+ Limit thread name appropriately
+ https://bugs.webkit.org/show_bug.cgi?id=166676
+
+ Reviewed by Sam Weinig.
+
+ * TestWebKitAPI/Tests/WTF/StringView.cpp:
+ (TestWebKitAPI::TEST):
+ * TestWebKitAPI/Tests/WTF/WTFString.cpp:
+ (TestWebKitAPI::TEST):
+
</ins><span class="cx"> 2017-01-04 Andy Estes <aestes@apple.com>
</span><span class="cx">
</span><span class="cx"> [Cocoa] Teach SharedBuffer to return an NSArray of data segments to avoid flattening
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWTFStringViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WTF/StringView.cpp (210312 => 210313)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WTF/StringView.cpp        2017-01-05 02:49:51 UTC (rev 210312)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/StringView.cpp        2017-01-05 02:53:00 UTC (rev 210313)
</span><span class="lines">@@ -804,4 +804,52 @@
</span><span class="cx"> EXPECT_TRUE(StringView(emptyString().impl()).is8Bit());
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+TEST(WTF, StringViewRightBasic)
+{
+ auto reference = stringViewFromLiteral("Cappuccino");
+ EXPECT_TRUE(reference.right(0) == stringViewFromLiteral(""));
+ EXPECT_TRUE(reference.right(1) == stringViewFromLiteral("o"));
+ EXPECT_TRUE(reference.right(2) == stringViewFromLiteral("no"));
+ EXPECT_TRUE(reference.right(3) == stringViewFromLiteral("ino"));
+ EXPECT_TRUE(reference.right(4) == stringViewFromLiteral("cino"));
+ EXPECT_TRUE(reference.right(5) == stringViewFromLiteral("ccino"));
+ EXPECT_TRUE(reference.right(6) == stringViewFromLiteral("uccino"));
+ EXPECT_TRUE(reference.right(7) == stringViewFromLiteral("puccino"));
+ EXPECT_TRUE(reference.right(8) == stringViewFromLiteral("ppuccino"));
+ EXPECT_TRUE(reference.right(9) == stringViewFromLiteral("appuccino"));
+ EXPECT_TRUE(reference.right(10) == stringViewFromLiteral("Cappuccino"));
+}
+
+TEST(WTF, StringViewLeftBasic)
+{
+ auto reference = stringViewFromLiteral("Cappuccino");
+ EXPECT_TRUE(reference.left(0) == stringViewFromLiteral(""));
+ EXPECT_TRUE(reference.left(1) == stringViewFromLiteral("C"));
+ EXPECT_TRUE(reference.left(2) == stringViewFromLiteral("Ca"));
+ EXPECT_TRUE(reference.left(3) == stringViewFromLiteral("Cap"));
+ EXPECT_TRUE(reference.left(4) == stringViewFromLiteral("Capp"));
+ EXPECT_TRUE(reference.left(5) == stringViewFromLiteral("Cappu"));
+ EXPECT_TRUE(reference.left(6) == stringViewFromLiteral("Cappuc"));
+ EXPECT_TRUE(reference.left(7) == stringViewFromLiteral("Cappucc"));
+ EXPECT_TRUE(reference.left(8) == stringViewFromLiteral("Cappucci"));
+ EXPECT_TRUE(reference.left(9) == stringViewFromLiteral("Cappuccin"));
+ EXPECT_TRUE(reference.left(10) == stringViewFromLiteral("Cappuccino"));
+}
+
+TEST(WTF, StringViewReverseFindBasic)
+{
+ auto reference = stringViewFromLiteral("Cappuccino");
+ EXPECT_EQ(reference.reverseFind('o'), 9);
+ EXPECT_EQ(reference.reverseFind('n'), 8);
+ EXPECT_EQ(reference.reverseFind('c'), 6);
+ EXPECT_EQ(reference.reverseFind('p'), 3);
+ EXPECT_EQ(reference.reverseFind('k'), notFound);
+
+ EXPECT_EQ(reference.reverseFind('o', 8), notFound);
+ EXPECT_EQ(reference.reverseFind('c', 8), 6);
+ EXPECT_EQ(reference.reverseFind('c', 6), 6);
+ EXPECT_EQ(reference.reverseFind('c', 5), 5);
+ EXPECT_EQ(reference.reverseFind('c', 4), notFound);
+}
+
</ins><span class="cx"> } // namespace TestWebKitAPI
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWTFWTFStringcpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WTF/WTFString.cpp (210312 => 210313)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WTF/WTFString.cpp        2017-01-05 02:49:51 UTC (rev 210312)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/WTFString.cpp        2017-01-05 02:53:00 UTC (rev 210313)
</span><span class="lines">@@ -313,4 +313,52 @@
</span><span class="cx"> ASSERT_FALSE(equal(string2, aBc));
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+TEST(WTF, StringRightBasic)
+{
+ auto reference = String::fromUTF8("Cappuccino");
+ EXPECT_TRUE(reference.right(0) == String::fromUTF8(""));
+ EXPECT_TRUE(reference.right(1) == String::fromUTF8("o"));
+ EXPECT_TRUE(reference.right(2) == String::fromUTF8("no"));
+ EXPECT_TRUE(reference.right(3) == String::fromUTF8("ino"));
+ EXPECT_TRUE(reference.right(4) == String::fromUTF8("cino"));
+ EXPECT_TRUE(reference.right(5) == String::fromUTF8("ccino"));
+ EXPECT_TRUE(reference.right(6) == String::fromUTF8("uccino"));
+ EXPECT_TRUE(reference.right(7) == String::fromUTF8("puccino"));
+ EXPECT_TRUE(reference.right(8) == String::fromUTF8("ppuccino"));
+ EXPECT_TRUE(reference.right(9) == String::fromUTF8("appuccino"));
+ EXPECT_TRUE(reference.right(10) == String::fromUTF8("Cappuccino"));
+}
+
+TEST(WTF, StringLeftBasic)
+{
+ auto reference = String::fromUTF8("Cappuccino");
+ EXPECT_TRUE(reference.left(0) == String::fromUTF8(""));
+ EXPECT_TRUE(reference.left(1) == String::fromUTF8("C"));
+ EXPECT_TRUE(reference.left(2) == String::fromUTF8("Ca"));
+ EXPECT_TRUE(reference.left(3) == String::fromUTF8("Cap"));
+ EXPECT_TRUE(reference.left(4) == String::fromUTF8("Capp"));
+ EXPECT_TRUE(reference.left(5) == String::fromUTF8("Cappu"));
+ EXPECT_TRUE(reference.left(6) == String::fromUTF8("Cappuc"));
+ EXPECT_TRUE(reference.left(7) == String::fromUTF8("Cappucc"));
+ EXPECT_TRUE(reference.left(8) == String::fromUTF8("Cappucci"));
+ EXPECT_TRUE(reference.left(9) == String::fromUTF8("Cappuccin"));
+ EXPECT_TRUE(reference.left(10) == String::fromUTF8("Cappuccino"));
+}
+
+TEST(WTF, StringReverseFindBasic)
+{
+ auto reference = String::fromUTF8("Cappuccino");
+ EXPECT_EQ(reference.reverseFind('o'), 9);
+ EXPECT_EQ(reference.reverseFind('n'), 8);
+ EXPECT_EQ(reference.reverseFind('c'), 6);
+ EXPECT_EQ(reference.reverseFind('p'), 3);
+ EXPECT_EQ(reference.reverseFind('k'), notFound);
+
+ EXPECT_EQ(reference.reverseFind('o', 8), notFound);
+ EXPECT_EQ(reference.reverseFind('c', 8), 6);
+ EXPECT_EQ(reference.reverseFind('c', 6), 6);
+ EXPECT_EQ(reference.reverseFind('c', 5), 5);
+ EXPECT_EQ(reference.reverseFind('c', 4), notFound);
+}
+
</ins><span class="cx"> } // namespace TestWebKitAPI
</span></span></pre>
</div>
</div>
</body>
</html>