Roll out r242014; it caused crashes in compositing logging (webkit.org/b/195141)
authorsimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 28 Feb 2019 04:35:25 +0000 (04:35 +0000)
committersimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 28 Feb 2019 04:35:25 +0000 (04:35 +0000)
Source/JavaScriptCore:

* bytecode/CodeBlock.cpp:
(JSC::CodeBlock::nameForRegister):

Source/WebCore:

* dom/Document.cpp:
(WebCore::Document::lastModified const):
* html/FTPDirectoryDocument.cpp:
(WebCore::processFileDateString):
* mathml/MathMLElement.cpp:
(WebCore::convertToPercentageIfNeeded):
(WebCore::MathMLElement::collectStyleForPresentationAttribute):
* page/cocoa/ResourceUsageOverlayCocoa.mm:
(WebCore::ResourceUsageOverlay::platformDraw):
* page/linux/ResourceUsageOverlayLinux.cpp:
(WebCore::cpuUsageString):
(WebCore::gcTimerString):
* platform/DateComponents.cpp:
(WebCore::DateComponents::toStringForTime const):
(WebCore::DateComponents::toString const):
* platform/LocalizedStrings.cpp:
(WebCore::localizedString):
* platform/audio/HRTFElevation.cpp:
(WebCore::HRTFElevation::calculateKernelsForAzimuthElevation):
* platform/mock/MockRealtimeVideoSource.cpp:
(WebCore::MockRealtimeVideoSource::drawText):
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::logLayerInfo):
* rendering/RenderTheme.cpp:
(WebCore::RenderTheme::formatMediaControlsTime const):

Source/WebKit:

* UIProcess/WebAuthentication/Cocoa/LocalAuthenticator.mm:
(WebKit::LocalAuthenticator::getAssertion):

Source/WebKitLegacy/win:

* FullscreenVideoController.cpp:
(timeToString):

Source/WTF:

* wtf/Assertions.cpp:
(WTF::createWithFormatAndArguments): Deleted.
* wtf/HexNumber.h:
(WTF::StringTypeAdapter<HexNumberBuffer>::toString const):
* wtf/text/StringConcatenate.h:
(WTF::makeString):
(WTF::pad): Deleted.
(WTF::StringTypeAdapter<PaddingSpecification<UnderlyingAdapterType>>::StringTypeAdapter): Deleted.
(WTF::StringTypeAdapter<PaddingSpecification<UnderlyingAdapterType>>::length const): Deleted.
(WTF::StringTypeAdapter<PaddingSpecification<UnderlyingAdapterType>>::is8Bit const): Deleted.
(WTF::StringTypeAdapter<PaddingSpecification<UnderlyingAdapterType>>::writeTo const): Deleted.
* wtf/text/StringConcatenateNumbers.h:
(WTF::FormattedNumber::fixedPrecision):
(WTF::FormattedNumber::fixedWidth):
(WTF::StringTypeAdapter<FormattedNumber>::toString const):
* wtf/text/StringOperators.h:
(WTF::StringAppend::StringAppend):
* wtf/text/StringView.h:
(WTF::StringView::invalidate):
* wtf/text/WTFString.cpp:
(WTF::createWithFormatAndArguments):
(WTF::String::format):
* wtf/text/WTFString.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@242189 268f45cc-cd09-0410-ab3c-d52691b4dbfc

27 files changed:
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/bytecode/CodeBlock.cpp
Source/WTF/ChangeLog
Source/WTF/wtf/Assertions.cpp
Source/WTF/wtf/HexNumber.h
Source/WTF/wtf/text/StringConcatenate.h
Source/WTF/wtf/text/StringConcatenateNumbers.h
Source/WTF/wtf/text/StringOperators.h
Source/WTF/wtf/text/StringView.h
Source/WTF/wtf/text/WTFString.cpp
Source/WTF/wtf/text/WTFString.h
Source/WebCore/ChangeLog
Source/WebCore/dom/Document.cpp
Source/WebCore/html/FTPDirectoryDocument.cpp
Source/WebCore/mathml/MathMLElement.cpp
Source/WebCore/page/cocoa/ResourceUsageOverlayCocoa.mm
Source/WebCore/page/linux/ResourceUsageOverlayLinux.cpp
Source/WebCore/platform/DateComponents.cpp
Source/WebCore/platform/LocalizedStrings.cpp
Source/WebCore/platform/audio/HRTFElevation.cpp
Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp
Source/WebCore/rendering/RenderLayerCompositor.cpp
Source/WebCore/rendering/RenderTheme.cpp
Source/WebKit/ChangeLog
Source/WebKit/UIProcess/WebAuthentication/Cocoa/LocalAuthenticator.mm
Source/WebKitLegacy/win/ChangeLog
Source/WebKitLegacy/win/FullscreenVideoController.cpp

index d1af2c9..e16f5d0 100644 (file)
@@ -1,3 +1,10 @@
+2019-02-27  Simon Fraser  <simon.fraser@apple.com>
+
+        Roll out r242014; it caused crashes in compositing logging (webkit.org/b/195141)
+
+        * bytecode/CodeBlock.cpp:
+        (JSC::CodeBlock::nameForRegister):
+
 2019-02-27  Antoine Quint  <graouts@apple.com>
 
         Support Pointer Events on macOS
index ae7e813..23527e4 100644 (file)
@@ -92,7 +92,6 @@
 #include <wtf/Forward.h>
 #include <wtf/SimpleStats.h>
 #include <wtf/StringPrintStream.h>
-#include <wtf/text/StringConcatenateNumbers.h>
 #include <wtf/text/UniquedStringImpl.h>
 
 #if ENABLE(ASSEMBLER)
@@ -2889,9 +2888,9 @@ String CodeBlock::nameForRegister(VirtualRegister virtualRegister)
     if (virtualRegister == thisRegister())
         return "this"_s;
     if (virtualRegister.isArgument())
-        return makeString("arguments[", pad(' ', 3, virtualRegister.toArgument()), ']');
+        return String::format("arguments[%3d]", virtualRegister.toArgument());
 
-    return emptyString();
+    return "";
 }
 
 ValueProfile* CodeBlock::tryGetValueProfileForBytecodeOffset(int bytecodeOffset)
index 118c592..44d118b 100644 (file)
@@ -1,3 +1,31 @@
+2019-02-27  Simon Fraser  <simon.fraser@apple.com>
+
+        Roll out r242014; it caused crashes in compositing logging (webkit.org/b/195141)
+
+        * wtf/Assertions.cpp:
+        (WTF::createWithFormatAndArguments): Deleted.
+        * wtf/HexNumber.h:
+        (WTF::StringTypeAdapter<HexNumberBuffer>::toString const):
+        * wtf/text/StringConcatenate.h:
+        (WTF::makeString):
+        (WTF::pad): Deleted.
+        (WTF::StringTypeAdapter<PaddingSpecification<UnderlyingAdapterType>>::StringTypeAdapter): Deleted.
+        (WTF::StringTypeAdapter<PaddingSpecification<UnderlyingAdapterType>>::length const): Deleted.
+        (WTF::StringTypeAdapter<PaddingSpecification<UnderlyingAdapterType>>::is8Bit const): Deleted.
+        (WTF::StringTypeAdapter<PaddingSpecification<UnderlyingAdapterType>>::writeTo const): Deleted.
+        * wtf/text/StringConcatenateNumbers.h:
+        (WTF::FormattedNumber::fixedPrecision):
+        (WTF::FormattedNumber::fixedWidth):
+        (WTF::StringTypeAdapter<FormattedNumber>::toString const):
+        * wtf/text/StringOperators.h:
+        (WTF::StringAppend::StringAppend):
+        * wtf/text/StringView.h:
+        (WTF::StringView::invalidate):
+        * wtf/text/WTFString.cpp:
+        (WTF::createWithFormatAndArguments):
+        (WTF::String::format):
+        * wtf/text/WTFString.h:
+
 2019-02-26  Mark Lam  <mark.lam@apple.com>
 
         Remove remaining poisoning code.
index d78ab97..25f2691 100644 (file)
 #include <unistd.h>
 #endif
 
-namespace WTF {
-
-WTF_ATTRIBUTE_PRINTF(1, 0) static String createWithFormatAndArguments(const char* format, va_list args)
-{
-    va_list argsCopy;
-    va_copy(argsCopy, args);
-
-    ALLOW_NONLITERAL_FORMAT_BEGIN
-
-#if USE(CF) && !OS(WINDOWS)
-    if (strstr(format, "%@")) {
-        auto cfFormat = adoptCF(CFStringCreateWithCString(kCFAllocatorDefault, format, kCFStringEncodingUTF8));
-        auto result = adoptCF(CFStringCreateWithFormatAndArguments(kCFAllocatorDefault, nullptr, cfFormat.get(), args));
-        va_end(argsCopy);
-        return result.get();
-    }
-#endif
-
-    // Do the format once to get the length.
-#if COMPILER(MSVC)
-    int result = _vscprintf(format, args);
-#else
-    char ch;
-    int result = vsnprintf(&ch, 1, format, args);
-#endif
-
-    if (!result) {
-        va_end(argsCopy);
-        return emptyString();
-    }
-    if (result < 0) {
-        va_end(argsCopy);
-        return { };
-    }
-
-    Vector<char, 256> buffer;
-    unsigned length = result;
-    buffer.grow(length + 1);
-
-    // Now do the formatting again, guaranteed to fit.
-    vsnprintf(buffer.data(), buffer.size(), format, argsCopy);
-    va_end(argsCopy);
-
-    ALLOW_NONLITERAL_FORMAT_END
-
-    return StringImpl::create(reinterpret_cast<const LChar*>(buffer.data()), length);
-}
-
-}
-
 extern "C" {
 
 static void logToStderr(const char* buffer)
@@ -443,7 +393,7 @@ static void WTFLogVaList(WTFLogChannel* channel, const char* format, va_list arg
     ASSERT(channel->state == WTFLogChannelOnWithAccumulation);
 
     ALLOW_NONLITERAL_FORMAT_BEGIN
-    String loggingString = WTF::createWithFormatAndArguments(format, args);
+    String loggingString = String::format(format, args);
     ALLOW_NONLITERAL_FORMAT_END
 
     if (!loggingString.endsWith('\n'))
index 2012b8f..90ad90a 100644 (file)
@@ -102,6 +102,7 @@ public:
     unsigned length() const { return m_buffer.length; }
     bool is8Bit() const { return true; }
     template<typename CharacterType> void writeTo(CharacterType* destination) const { StringImpl::copyCharacters(destination, characters(), length()); }
+    String toString() const { return { characters(), length() }; }
 
 private:
     const LChar* characters() const { return &*(m_buffer.characters.end() - length()); }
index a5c6073..19f2312 100644 (file)
@@ -25,7 +25,7 @@
 
 #pragma once
 
-#include <cstring>
+#include <string.h>
 #include <wtf/CheckedArithmetic.h>
 #include <wtf/text/AtomicString.h>
 #include <wtf/text/StringView.h>
 
 namespace WTF {
 
-template<> class StringTypeAdapter<char, void> {
+template<typename StringType, typename>
+class StringTypeAdapter;
+
+template<>
+class StringTypeAdapter<char, void> {
 public:
     StringTypeAdapter(char character)
-        : m_character { character }
+        : m_character(character)
     {
     }
 
     unsigned length() { return 1; }
     bool is8Bit() { return true; }
-    template<typename CharacterType> void writeTo(CharacterType* destination) const { *destination = m_character; }
+
+    void writeTo(LChar* destination) const
+    {
+        *destination = m_character;
+    }
+
+    void writeTo(UChar* destination) const
+    {
+        *destination = m_character;
+    }
+
+    String toString() const { return String(&m_character, 1); }
 
 private:
     char m_character;
 };
 
-template<> class StringTypeAdapter<UChar, void> {
+template<>
+class StringTypeAdapter<UChar, void> {
 public:
     StringTypeAdapter(UChar character)
-        : m_character { character }
+        : m_character(character)
     {
     }
 
     unsigned length() const { return 1; }
-    bool is8Bit() const { return isLatin1(m_character); }
+    bool is8Bit() const { return m_character <= 0xff; }
 
     void writeTo(LChar* destination) const
     {
         ASSERT(is8Bit());
+        *destination = static_cast<LChar>(m_character);
+    }
+
+    void writeTo(UChar* destination) const
+    {
         *destination = m_character;
     }
 
-    void writeTo(UChar* destination) const { *destination = m_character; }
+    String toString() const { return String(&m_character, 1); }
 
 private:
     UChar m_character;
 };
 
-template<> class StringTypeAdapter<const LChar*, void> {
+template<>
+class StringTypeAdapter<const LChar*, void> {
 public:
     StringTypeAdapter(const LChar* characters)
-        : m_characters { characters }
-        , m_length { computeLength(characters) }
+        : m_characters(characters)
     {
+        size_t length = strlen(reinterpret_cast<const char*>(characters));
+        RELEASE_ASSERT(length <= String::MaxLength);
+        m_length = static_cast<unsigned>(length);
     }
 
     unsigned length() const { return m_length; }
     bool is8Bit() const { return true; }
-    template<typename CharacterType> void writeTo(CharacterType* destination) const { StringImpl::copyCharacters(destination, m_characters, m_length); }
 
-private:
-    static unsigned computeLength(const LChar* characters)
+    void writeTo(LChar* destination) const
     {
-        size_t length = std::strlen(reinterpret_cast<const char*>(characters));
-        RELEASE_ASSERT(length <= String::MaxLength);
-        return static_cast<unsigned>(length);
+        StringView(m_characters, m_length).getCharactersWithUpconvert(destination);
     }
 
+    void writeTo(UChar* destination) const
+    {
+        StringView(m_characters, m_length).getCharactersWithUpconvert(destination);
+    }
+
+    String toString() const { return String(m_characters, m_length); }
+
+private:
     const LChar* m_characters;
     unsigned m_length;
 };
 
-template<> class StringTypeAdapter<const UChar*, void> {
+template<>
+class StringTypeAdapter<const UChar*, void> {
 public:
     StringTypeAdapter(const UChar* characters)
-        : m_characters { characters }
-        , m_length { computeLength(characters) }
+        : m_characters(characters)
     {
+        size_t length = 0;
+        while (m_characters[length])
+            ++length;
+        RELEASE_ASSERT(length <= String::MaxLength);
+        m_length = static_cast<unsigned>(length);
     }
 
     unsigned length() const { return m_length; }
-    bool is8Bit() const { return !m_length; }
-    void writeTo(LChar*) const { ASSERT(!m_length); }
-    void writeTo(UChar* destination) const { StringImpl::copyCharacters(destination, m_characters, m_length); }
+    bool is8Bit() const { return false; }
 
-private:
-    static unsigned computeLength(const UChar* characters)
+    NO_RETURN_DUE_TO_CRASH void writeTo(LChar*) const
     {
-        size_t length = 0;
-        while (characters[length])
-            ++length;
-        RELEASE_ASSERT(length <= String::MaxLength);
-        return static_cast<unsigned>(length);
+        CRASH(); // FIXME make this a compile-time failure https://bugs.webkit.org/show_bug.cgi?id=165791
     }
 
+    void writeTo(UChar* destination) const
+    {
+        memcpy(destination, m_characters, m_length * sizeof(UChar));
+    }
+
+    String toString() const { return String(m_characters, m_length); }
+
+private:
     const UChar* m_characters;
     unsigned m_length;
 };
 
-template<> class StringTypeAdapter<const char*, void> : public StringTypeAdapter<const LChar*, void> {
+template<>
+class StringTypeAdapter<const char*, void> : public StringTypeAdapter<const LChar*, void> {
 public:
     StringTypeAdapter(const char* characters)
-        : StringTypeAdapter<const LChar*, void> { reinterpret_cast<const LChar*>(characters) }
+        : StringTypeAdapter<const LChar*, void>(reinterpret_cast<const LChar*>(characters))
     {
     }
 };
 
-template<> class StringTypeAdapter<char*, void> : public StringTypeAdapter<const char*, void> {
+template<>
+class StringTypeAdapter<char*, void> : public StringTypeAdapter<const char*, void> {
 public:
     StringTypeAdapter(const char* characters)
-        : StringTypeAdapter<const char*, void> { characters }
+        : StringTypeAdapter<const char*, void>(characters)
     {
     }
 };
 
-template<> class StringTypeAdapter<ASCIILiteral, void> : public StringTypeAdapter<const char*, void> {
+template<>
+class StringTypeAdapter<ASCIILiteral, void> : public StringTypeAdapter<const char*, void> {
 public:
     StringTypeAdapter(ASCIILiteral characters)
-        : StringTypeAdapter<const char*, void> { characters }
+        : StringTypeAdapter<const char*, void>(characters)
     {
     }
 };
 
-template<> class StringTypeAdapter<Vector<char>, void> {
+template<>
+class StringTypeAdapter<Vector<char>, void> {
 public:
     StringTypeAdapter(const Vector<char>& vector)
-        : m_vector { vector }
+        : m_vector(vector)
     {
     }
 
     size_t length() const { return m_vector.size(); }
     bool is8Bit() const { return true; }
-    template<typename CharacterType> void writeTo(CharacterType* destination) const { StringImpl::copyCharacters(destination, characters(), length()); }
 
-private:
-    const LChar* characters() const
+    void writeTo(LChar* destination) const
     {
-        return reinterpret_cast<const LChar*>(m_vector.data());
+        StringView(reinterpret_cast<const LChar*>(m_vector.data()), m_vector.size()).getCharactersWithUpconvert(destination);
     }
 
+    void writeTo(UChar* destination) const
+    {
+        StringView(reinterpret_cast<const LChar*>(m_vector.data()), m_vector.size()).getCharactersWithUpconvert(destination);
+    }
+
+    String toString() const { return String(m_vector.data(), m_vector.size()); }
+
+private:
     const Vector<char>& m_vector;
 };
 
-template<> class StringTypeAdapter<String, void> {
+template<>
+class StringTypeAdapter<String, void> {
 public:
     StringTypeAdapter(const String& string)
-        : m_string { string }
+        : m_string(string)
     {
     }
 
     unsigned length() const { return m_string.length(); }
     bool is8Bit() const { return m_string.isNull() || m_string.is8Bit(); }
-    template<typename CharacterType> void writeTo(CharacterType* destination) const
+
+    void writeTo(LChar* destination) const
     {
-        StringView { m_string }.getCharactersWithUpconvert(destination);
+        StringView(m_string).getCharactersWithUpconvert(destination);
         WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING();
     }
 
-private:
-    const String& m_string;
-};
-
-template<> class StringTypeAdapter<AtomicString, void> : public StringTypeAdapter<String, void> {
-public:
-    StringTypeAdapter(const AtomicString& string)
-        : StringTypeAdapter<String, void> { string.string() }
+    void writeTo(UChar* destination) const
     {
+        StringView(m_string).getCharactersWithUpconvert(destination);
+        WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING();
     }
-};
 
-template<typename UnderlyingAdapterType> struct PaddingSpecification {
-    LChar character;
-    unsigned length;
-    UnderlyingAdapterType underlyingAdapter;
-};
+    String toString() const { return m_string; }
 
-template<typename StringType> PaddingSpecification<StringTypeAdapter<StringType>> pad(char character, unsigned length, StringType adapter)
-{
-    return { static_cast<LChar>(character), length, StringTypeAdapter<StringType> { adapter } };
-}
+private:
+    const String& m_string;
+};
 
-template<typename UnderlyingAdapterType> class StringTypeAdapter<PaddingSpecification<UnderlyingAdapterType>> {
+template<>
+class StringTypeAdapter<AtomicString, void> : public StringTypeAdapter<String, void> {
 public:
-    StringTypeAdapter(const PaddingSpecification<UnderlyingAdapterType>& padding)
-        : m_padding { padding }
-    {
-    }
-
-    unsigned length() const { return std::max(m_padding.length, m_padding.underlyingAdapter.length()); }
-    bool is8Bit() const { return m_padding.underlyingAdapter.is8Bit(); }
-    template<typename CharacterType> void writeTo(CharacterType* destination) const
+    StringTypeAdapter(const AtomicString& string)
+        : StringTypeAdapter<String, void>(string.string())
     {
-        unsigned underlyingLength = m_padding.underlyingAdapter.length();
-        unsigned count = 0;
-        if (underlyingLength < m_padding.length) {
-            count = m_padding.length - underlyingLength;
-            for (unsigned i = 0; i < count; ++i)
-                destination[i] = m_padding.character;
-        }
-        m_padding.underlyingAdapter.writeTo(destination + count);
     }
-
-private:
-    const PaddingSpecification<UnderlyingAdapterType>& m_padding;
 };
 
 template<typename Adapter>
@@ -295,6 +314,13 @@ String tryMakeString(StringTypes ...strings)
     return tryMakeStringFromAdapters(StringTypeAdapter<StringTypes>(strings)...);
 }
 
+// Convenience only.
+template<typename StringType>
+String makeString(StringType string)
+{
+    return String(string);
+}
+
 template<typename... StringTypes>
 String makeString(StringTypes... strings)
 {
@@ -307,7 +333,6 @@ String makeString(StringTypes... strings)
 } // namespace WTF
 
 using WTF::makeString;
-using WTF::pad;
 using WTF::tryMakeString;
 
 #include <wtf/text/StringOperators.h>
index 6f4ef89..a375ecc 100644 (file)
@@ -42,6 +42,7 @@ public:
     unsigned length() const { return lengthOfNumberAsStringSigned(m_number); }
     bool is8Bit() const { return true; }
     template<typename CharacterType> void writeTo(CharacterType* destination) const { writeNumberToBufferSigned(m_number, destination); }
+    String toString() const { return String::number(m_number); }
 
 private:
     SignedInt m_number;
@@ -58,6 +59,7 @@ public:
     unsigned length() const { return lengthOfNumberAsStringUnsigned(m_number); }
     bool is8Bit() const { return true; }
     template<typename CharacterType> void writeTo(CharacterType* destination) const { writeNumberToBufferUnsigned(m_number, destination); }
+    String toString() const { return String::number(m_number); }
 
 private:
     UnsignedInt m_number;
@@ -69,12 +71,13 @@ public:
     StringTypeAdapter(FloatingPoint number)
     {
         numberToString(number, m_buffer);
-        m_length = std::strlen(m_buffer);
+        m_length = strlen(m_buffer);
     }
 
     unsigned length() const { return m_length; }
     bool is8Bit() const { return true; }
     template<typename CharacterType> void writeTo(CharacterType* destination) const { StringImpl::copyCharacters(destination, buffer(), m_length); }
+    String toString() const { return { buffer(), m_length }; }
 
 private:
     const LChar* buffer() const { return reinterpret_cast<const LChar*>(m_buffer); }
@@ -89,7 +92,7 @@ public:
     {
         FormattedNumber numberFormatter;
         numberToFixedPrecisionString(number, significantFigures, numberFormatter.m_buffer, trailingZerosTruncatingPolicy == TruncateTrailingZeros);
-        numberFormatter.m_length = std::strlen(numberFormatter.m_buffer);
+        numberFormatter.m_length = strlen(numberFormatter.m_buffer);
         return numberFormatter;
     }
 
@@ -97,7 +100,7 @@ public:
     {
         FormattedNumber numberFormatter;
         numberToFixedWidthString(number, decimalPlaces, numberFormatter.m_buffer);
-        numberFormatter.m_length = std::strlen(numberFormatter.m_buffer);
+        numberFormatter.m_length = strlen(numberFormatter.m_buffer);
         return numberFormatter;
     }
 
@@ -109,7 +112,8 @@ private:
     unsigned m_length;
 };
 
-template<> class StringTypeAdapter<FormattedNumber> {
+template<>
+class StringTypeAdapter<FormattedNumber> {
 public:
     StringTypeAdapter(const FormattedNumber& number)
         : m_number { number }
@@ -119,6 +123,7 @@ public:
     unsigned length() const { return m_number.length(); }
     bool is8Bit() const { return true; }
     template<typename CharacterType> void writeTo(CharacterType* destination) const { StringImpl::copyCharacters(destination, m_number.buffer(), m_number.length()); }
+    String toString() const { return { m_number.buffer(), m_number.length() }; }
 
 private:
     const FormattedNumber& m_number;
index 743ee9f..12e0826 100644 (file)
 
 namespace WTF {
 
-template<typename StringType1, typename StringType2> class StringAppend {
+template<typename StringType1, typename StringType2>
+class StringAppend {
 public:
     StringAppend(StringType1 string1, StringType2 string2)
-        : m_string1 { string1 }
-        , m_string2 { string2 }
+        : m_string1(string1)
+        , m_string2(string2)
     {
     }
 
@@ -84,13 +85,18 @@ template<typename StringType1, typename StringType2>
 class StringTypeAdapter<StringAppend<StringType1, StringType2>> {
 public:
     StringTypeAdapter<StringAppend<StringType1, StringType2>>(StringAppend<StringType1, StringType2>& buffer)
-        : m_buffer { buffer }
+        : m_buffer(buffer)
     {
     }
 
-    unsigned length() const { return m_buffer.length(); }
-    bool is8Bit() const { return m_buffer.is8Bit(); }
-    template<typename CharacterType> void writeTo(CharacterType* destination) const { m_buffer.writeTo(destination); }
+    unsigned length() { return m_buffer.length(); }
+
+    bool is8Bit() { return m_buffer.is8Bit(); }
+
+    void writeTo(LChar* destination) { m_buffer.writeTo(destination); }
+    void writeTo(UChar* destination) { m_buffer.writeTo(destination); }
+
+    String toString() const { return m_buffer; }
 
 private:
     StringAppend<StringType1, StringType2>& m_buffer;
index b3df3ae..701c55b 100644 (file)
@@ -565,23 +565,26 @@ inline size_t StringView::reverseFind(UChar character, unsigned index) const
 }
 
 #if !CHECK_STRINGVIEW_LIFETIME
-
 inline void StringView::invalidate(const StringImpl&)
 {
 }
-
 #endif
 
+template<typename StringType, typename> class StringTypeAdapter;
+
 template<> class StringTypeAdapter<StringView, void> {
 public:
     StringTypeAdapter(StringView string)
-        : m_string { string }
+        : m_string(string)
     {
     }
 
     unsigned length() { return m_string.length(); }
     bool is8Bit() { return m_string.is8Bit(); }
-    template<typename CharacterType> void writeTo(CharacterType* destination) { m_string.getCharactersWithUpconvert(destination); }
+    void writeTo(LChar* destination) { m_string.getCharactersWithUpconvert(destination); }
+    void writeTo(UChar* destination) { m_string.getCharactersWithUpconvert(destination); }
+
+    String toString() const { return m_string.toString(); }
 
 private:
     StringView m_string;
index de58ff7..918877e 100644 (file)
@@ -449,6 +449,61 @@ Vector<UChar> String::charactersWithNullTermination() const
     return result;
 }
 
+WTF_ATTRIBUTE_PRINTF(1, 0) static String createWithFormatAndArguments(const char *format, va_list args)
+{
+    va_list argsCopy;
+    va_copy(argsCopy, args);
+
+    ALLOW_NONLITERAL_FORMAT_BEGIN
+
+#if USE(CF) && !OS(WINDOWS)
+    if (strstr(format, "%@")) {
+        auto cfFormat = adoptCF(CFStringCreateWithCString(kCFAllocatorDefault, format, kCFStringEncodingUTF8));
+        auto result = adoptCF(CFStringCreateWithFormatAndArguments(kCFAllocatorDefault, nullptr, cfFormat.get(), args));
+        va_end(argsCopy);
+        return result.get();
+    }
+#endif
+
+    // Do the format once to get the length.
+#if COMPILER(MSVC)
+    int result = _vscprintf(format, args);
+#else
+    char ch;
+    int result = vsnprintf(&ch, 1, format, args);
+#endif
+
+    if (!result) {
+        va_end(argsCopy);
+        return emptyString();
+    }
+    if (result < 0) {
+        va_end(argsCopy);
+        return String();
+    }
+
+    Vector<char, 256> buffer;
+    unsigned len = result;
+    buffer.grow(len + 1);
+
+    // Now do the formatting again, guaranteed to fit.
+    vsnprintf(buffer.data(), buffer.size(), format, argsCopy);
+    va_end(argsCopy);
+
+    ALLOW_NONLITERAL_FORMAT_END
+
+    return StringImpl::create(reinterpret_cast<const LChar*>(buffer.data()), len);
+}
+
+String String::format(const char *format, ...)
+{
+    va_list args;
+    va_start(args, format);
+    String result = createWithFormatAndArguments(format, args);
+    va_end(args);
+    return result;
+}
+
 String String::number(int number)
 {
     return numberToStringSigned<String>(number);
index 6534035..821f059 100644 (file)
@@ -261,6 +261,8 @@ public:
     // Use convertToASCIILowercase instead if ASCII case insensitive comparison is desired.
     WTF_EXPORT_PRIVATE String foldCase() const;
 
+    WTF_EXPORT_PRIVATE static String format(const char *, ...) WTF_ATTRIBUTE_PRINTF(1, 2);
+
     // Returns an uninitialized string. The characters needs to be written
     // into the buffer returned in data before the returned string is used.
     static String createUninitialized(unsigned length, UChar*& data) { return StringImpl::createUninitialized(length, data); }
index 5cd8731..26536b1 100644 (file)
@@ -1,3 +1,33 @@
+2019-02-27  Simon Fraser  <simon.fraser@apple.com>
+
+        Roll out r242014; it caused crashes in compositing logging (webkit.org/b/195141)
+
+        * dom/Document.cpp:
+        (WebCore::Document::lastModified const):
+        * html/FTPDirectoryDocument.cpp:
+        (WebCore::processFileDateString):
+        * mathml/MathMLElement.cpp:
+        (WebCore::convertToPercentageIfNeeded):
+        (WebCore::MathMLElement::collectStyleForPresentationAttribute):
+        * page/cocoa/ResourceUsageOverlayCocoa.mm:
+        (WebCore::ResourceUsageOverlay::platformDraw):
+        * page/linux/ResourceUsageOverlayLinux.cpp:
+        (WebCore::cpuUsageString):
+        (WebCore::gcTimerString):
+        * platform/DateComponents.cpp:
+        (WebCore::DateComponents::toStringForTime const):
+        (WebCore::DateComponents::toString const):
+        * platform/LocalizedStrings.cpp:
+        (WebCore::localizedString):
+        * platform/audio/HRTFElevation.cpp:
+        (WebCore::HRTFElevation::calculateKernelsForAzimuthElevation):
+        * platform/mock/MockRealtimeVideoSource.cpp:
+        (WebCore::MockRealtimeVideoSource::drawText):
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::logLayerInfo):
+        * rendering/RenderTheme.cpp:
+        (WebCore::RenderTheme::formatMediaControlsTime const):
+
 2019-02-27  Zalan Bujtas  <zalan@apple.com>
 
         [ContentChangeObserver] Move _WKObservingContentChanges from global to ContentChangeObserver class
index 0e6dd9c..6600e4c 100644 (file)
@@ -4996,19 +4996,15 @@ String Document::lastModified() const
     else if (loader())
         dateTime = loader()->response().lastModified();
 
-    // FIXME: If this document came from the file system, the HTML specification tells
-    // us to read the last modification date from the file system.
+    // FIXME: If this document came from the file system, the HTML5
+    // specification tells us to read the last modification date from the file
+    // system.
     if (!dateTime)
         dateTime = WallTime::now();
 
     auto ctime = dateTime.value().secondsSinceEpoch().secondsAs<time_t>();
     auto localDateTime = std::localtime(&ctime);
-    return makeString(pad('0', 2, localDateTime->tm_mon + 1), '/',
-        pad('0', 2, localDateTime->tm_mday), '/',
-        pad('0', 4, 1900 + localDateTime->tm_year), ' ',
-        pad('0', 2, localDateTime->tm_hour), ':',
-        pad('0', 2, localDateTime->tm_min), ':',
-        pad('0', 2, localDateTime->tm_sec));
+    return String::format("%02d/%02d/%04d %02d:%02d:%02d", localDateTime->tm_mon + 1, localDateTime->tm_mday, 1900 + localDateTime->tm_year, localDateTime->tm_hour, localDateTime->tm_min, localDateTime->tm_sec);
 }
 
 void Document::setCookieURL(const URL& url)
index 36166f1..6a89c79 100644 (file)
@@ -210,12 +210,12 @@ static String processFileDateString(const FTPTime& fileTime)
         if (hour < 12) {
             if (hour == 0)
                 hour = 12;
-            timeOfDay = makeString(", ", hour, ':', pad('0', 2, fileTime.tm_min), " AM");
+            timeOfDay = String::format(", %i:%02i AM", hour, fileTime.tm_min);
         } else {
             hour = hour - 12;
             if (hour == 0)
                 hour = 12;
-            timeOfDay = makeString(", ", hour, ':', pad('0', 2, fileTime.tm_min), " PM");
+            timeOfDay = String::format(", %i:%02i PM", hour, fileTime.tm_min);
         }
     }
 
index 99b16bc..96d570a 100644 (file)
@@ -39,7 +39,6 @@
 #include "MouseEvent.h"
 #include "RenderTableCell.h"
 #include <wtf/IsoMallocInlines.h>
-#include <wtf/text/StringConcatenateNumbers.h>
 
 namespace WebCore {
 
@@ -100,13 +99,11 @@ bool MathMLElement::isPresentationAttribute(const QualifiedName& name) const
 
 static String convertToPercentageIfNeeded(const AtomicString& value)
 {
-    // FIXME: Might be better to use double than float.
-    // FIXME: Might be better to use "shortest" numeric formatting instead of fixed width.
     bool ok = false;
     float unitlessValue = value.toFloat(&ok);
-    if (!ok)
-        return value;
-    return makeString(FormattedNumber::fixedWidth(unitlessValue * 100, 3), '%');
+    if (ok)
+        return String::format("%.3f%%", unitlessValue * 100.0);
+    return value;
 }
 
 void MathMLElement::collectStyleForPresentationAttribute(const QualifiedName& name, const AtomicString& value, MutableStyleProperties& style)
@@ -119,7 +116,7 @@ void MathMLElement::collectStyleForPresentationAttribute(const QualifiedName& na
             addPropertyToPresentationAttributeStyle(style, CSSPropertyFontSize, convertToPercentageIfNeeded(value));
     } else if (name == mathcolorAttr)
         addPropertyToPresentationAttributeStyle(style, CSSPropertyColor, value);
-    // FIXME: The following are deprecated attributes that should lose if there is a conflict with a non-deprecated attribute.
+    // FIXME: deprecated attributes that should loose in a conflict with a non deprecated attribute
     else if (name == fontsizeAttr)
         addPropertyToPresentationAttributeStyle(style, CSSPropertyFontSize, value);
     else if (name == backgroundAttr)
@@ -137,7 +134,8 @@ void MathMLElement::collectStyleForPresentationAttribute(const QualifiedName& na
             addPropertyToPresentationAttributeStyle(style, CSSPropertyDirection, value);
     }  else {
         ASSERT(!isPresentationAttribute(name));
-        StyledElement::collectStyleForPresentationAttribute(name, value, style);
+        StyledElement::collectStyleForPresentationAttribute(name, value
+        , style);
     }
 }
 
index 56b65d6..198b298 100644 (file)
@@ -468,7 +468,7 @@ void ResourceUsageOverlay::platformDraw(CGContextRef context)
         size_t reclaimable = category.reclaimableSize.last();
         size_t external = category.externalSize.last();
         
-        String label = makeString(pad(' ', 11, category.name), ": ", formatByteNumber(dirty));
+        String label = String::format("% 11s: %s", category.name.ascii().data(), formatByteNumber(dirty).ascii().data());
         if (external)
             label = label + makeString(" + ", formatByteNumber(external));
         if (reclaimable)
index 9571d12..e78ffaa 100644 (file)
@@ -46,7 +46,7 @@ static String cpuUsageString(float cpuUsage)
 {
     if (cpuUsage < 0)
         return "<unknown>"_s;
-    return makeString(FormattedNumber::fixedWidth(cpuUsage, 1), '%');
+    return String::format("%.1f%%", cpuUsage);
 }
 
 static String formatByteNumber(size_t number)
@@ -64,7 +64,7 @@ static String gcTimerString(MonotonicTime timerFireDate, MonotonicTime now)
 {
     if (std::isnan(timerFireDate))
         return "[not scheduled]"_s;
-    return String::number((timerFireDate - now).seconds());
+    return String::format("%g", (timerFireDate - now).seconds());
 }
 
 static const float gFontSize = 14;
index 9244e3d..dd5adcb 100644 (file)
@@ -35,7 +35,7 @@
 #include <wtf/ASCIICType.h>
 #include <wtf/DateMath.h>
 #include <wtf/MathExtras.h>
-#include <wtf/text/StringConcatenateNumbers.h>
+#include <wtf/text/WTFString.h>
 
 namespace WebCore {
 
@@ -693,11 +693,11 @@ String DateComponents::toStringForTime(SecondFormat format) const
         FALLTHROUGH; // To None.
 #endif
     case None:
-        return makeString(pad('0', 2, m_hour), ':', pad('0', 2, m_minute));
+        return String::format("%02d:%02d", m_hour, m_minute);
     case Second:
-        return makeString(pad('0', 2, m_hour), ':', pad('0', 2, m_minute), ':', pad('0', 2, m_second));
+        return String::format("%02d:%02d:%02d", m_hour, m_minute, m_second);
     case Millisecond:
-        return makeString(pad('0', 2, m_hour), ':', pad('0', 2, m_minute), ':', pad('0', 2, m_second), '.', pad('0', 3, m_millisecond));
+        return String::format("%02d:%02d:%02d.%03d", m_hour, m_minute, m_second, m_millisecond);
     }
 }
 
@@ -705,17 +705,19 @@ String DateComponents::toString(SecondFormat format) const
 {
     switch (m_type) {
     case Date:
-        return makeString(pad('0', 4, m_year), '-', pad('0', 2, m_month + 1), '-', pad('0', 2, m_monthDay));
+        return String::format("%04d-%02d-%02d", m_year, m_month + 1, m_monthDay);
     case DateTime:
-        return makeString(pad('0', 4, m_year), '-', pad('0', 2, m_month + 1), '-', pad('0', 2, m_monthDay), 'T', toStringForTime(format), 'Z');
+        return String::format("%04d-%02d-%02dT", m_year, m_month + 1, m_monthDay)
+            + toStringForTime(format) + "Z"_str;
     case DateTimeLocal:
-        return makeString(pad('0', 4, m_year), '-', pad('0', 2, m_month + 1), '-', pad('0', 2, m_monthDay), 'T', toStringForTime(format));
+        return String::format("%04d-%02d-%02dT", m_year, m_month + 1, m_monthDay)
+            + toStringForTime(format);
     case Month:
-        return makeString(pad('0', 4, m_year), '-', pad('0', 2, m_month + 1));
+        return String::format("%04d-%02d", m_year, m_month + 1);
     case Time:
         return toStringForTime(format);
     case Week:
-        return makeString(pad('0', 4, m_year), "-W", pad('0', 2, m_week));
+        return String::format("%04d-W%02d", m_year, m_week);
     case Invalid:
         break;
     }
index 80e2e40..1bf4cd7 100644 (file)
 
 namespace WebCore {
 
-// Because |format| is used as the second parameter to va_start, it cannot be a reference
+// We can't use String::format for two reasons:
+//  1) It doesn't handle non-ASCII characters in the format string.
+//  2) It doesn't handle the %2$d syntax.
+// Note that because |format| is used as the second parameter to va_start, it cannot be a reference
 // type according to section 18.7/3 of the C++ N1905 standard.
 String formatLocalizedString(String format, ...)
 {
@@ -70,12 +73,10 @@ String formatLocalizedString(String format, ...)
 }
 
 #if !USE(CF)
-
 String localizedString(const char* key)
 {
     return String::fromUTF8(key, strlen(key));
 }
-
 #endif
 
 #if ENABLE(CONTEXT_MENUS)
index c84ab97..9e71ae9 100644 (file)
@@ -176,7 +176,7 @@ bool HRTFElevation::calculateKernelsForAzimuthElevation(int azimuth, int elevati
     AudioChannel* leftEarImpulseResponse = response->channel(AudioBus::ChannelLeft);
     AudioChannel* rightEarImpulseResponse = response->channel(AudioBus::ChannelRight);
 #else
-    String resourceName = makeString("IRC_", subjectName, "_C_R0195_T", pad('0', 3, azimuth), "_P", pad('0', 3, positiveElevation));
+    String resourceName = String::format("IRC_%s_C_R0195_T%03d_P%03d", subjectName.utf8().data(), azimuth, positiveElevation);
 
     RefPtr<AudioBus> impulseResponse(AudioBus::loadPlatformResource(resourceName.utf8().data(), sampleRate));
 
index f13c5b5..0b9f190 100644 (file)
@@ -350,10 +350,10 @@ void MockRealtimeVideoSource::drawText(GraphicsContext& context)
     FloatPoint timeLocation(captureSize.width() * .05, captureSize.height() * .15);
     context.setFillColor(Color::white);
     context.setTextDrawingMode(TextModeFill);
-    String string = makeString(pad('0', 2, hours), ':', pad('0', 2, minutes), ':', pad('0', 2, seconds), '.', pad('0', 3, milliseconds % 1000));
+    String string = String::format("%02u:%02u:%02u.%03u", hours, minutes, seconds, milliseconds % 1000);
     context.drawText(timeFont, TextRun((StringView(string))), timeLocation);
 
-    string = makeString(pad('0', 6, m_frameNumber++));
+    string = String::format("%06u", m_frameNumber++);
     timeLocation.move(0, m_baseFontSize);
     context.drawText(timeFont, TextRun((StringView(string))), timeLocation);
 
index 5e8ec4e..5d079a1 100644 (file)
@@ -60,7 +60,6 @@
 #include "Settings.h"
 #include "TiledBacking.h"
 #include "TransformState.h"
-#include <wtf/HexNumber.h>
 #include <wtf/MemoryPressureHandler.h>
 #include <wtf/SetForScope.h>
 #include <wtf/text/CString.h>
@@ -1324,8 +1323,10 @@ void RenderLayerCompositor::logLayerInfo(const RenderLayer& layer, const char* p
     absoluteBounds.move(layer.offsetFromAncestor(m_renderView.layer()));
     
     StringBuilder logString;
-    logString.append(makeString(pad(' ', 12 + depth * 2, hex(reinterpret_cast<uintptr_t>(&layer))), " id ", backing->graphicsLayer()->primaryLayerID(), " (", FormattedNumber::fixedWidth(absoluteBounds.x().toFloat(), 3), ',', FormattedNumber::fixedWidth(absoluteBounds.y().toFloat(), 3), '-', FormattedNumber::fixedWidth(absoluteBounds.maxX().toFloat(), 3), ',', FormattedNumber::fixedWidth(absoluteBounds.maxY().toFloat(), 3), ") ", FormattedNumber::fixedWidth(backing->backingStoreMemoryEstimate() / 1024, 2), "KB"));
-
+    logString.append(String::format("%*p id %" PRIu64 " (%.3f,%.3f-%.3f,%.3f) %.2fKB", 12 + depth * 2, &layer, backing->graphicsLayer()->primaryLayerID(),
+        absoluteBounds.x().toFloat(), absoluteBounds.y().toFloat(), absoluteBounds.maxX().toFloat(), absoluteBounds.maxY().toFloat(),
+        backing->backingStoreMemoryEstimate() / 1024));
+    
     if (!layer.renderer().style().hasAutoZIndex())
         logString.append(makeString(" z-index: ", layer.renderer().style().zIndex()));
 
index 585ef88..2a45f10 100644 (file)
@@ -46,7 +46,6 @@
 #include "TextControlInnerElements.h"
 #include <wtf/FileSystem.h>
 #include <wtf/NeverDestroyed.h>
-#include <wtf/text/StringConcatenateNumbers.h>
 
 #if ENABLE(METER_ELEMENT)
 #include "HTMLMeterElement.h"
@@ -569,14 +568,18 @@ String RenderTheme::formatMediaControlsTime(float time) const
 {
     if (!std::isfinite(time))
         time = 0;
-    // FIXME: Seems like it would be better to use std::lround here.
-    int seconds = static_cast<int>(std::abs(time));
+    int seconds = (int)fabsf(time);
     int hours = seconds / (60 * 60);
     int minutes = (seconds / 60) % 60;
     seconds %= 60;
-    if (hours)
-        return makeString((time < 0 ? "-" : ""), hours, ':', pad('0', 2, minutes), ':', pad('0', 2, seconds));
-    return makeString((time < 0 ? "-" : ""), pad('0', 2, minutes), ':', pad('0', 2, seconds));
+    if (hours) {
+        if (hours > 9)
+            return String::format("%s%02d:%02d:%02d", (time < 0 ? "-" : ""), hours, minutes, seconds);
+
+        return String::format("%s%01d:%02d:%02d", (time < 0 ? "-" : ""), hours, minutes, seconds);
+    }
+
+    return String::format("%s%02d:%02d", (time < 0 ? "-" : ""), minutes, seconds);
 }
 
 String RenderTheme::formatMediaControlsCurrentTime(float currentTime, float /*duration*/) const
index 0fcdf1f..ee2b349 100644 (file)
@@ -1,3 +1,10 @@
+2019-02-27  Simon Fraser  <simon.fraser@apple.com>
+
+        Roll out r242014; it caused crashes in compositing logging (webkit.org/b/195141)
+
+        * UIProcess/WebAuthentication/Cocoa/LocalAuthenticator.mm:
+        (WebKit::LocalAuthenticator::getAssertion):
+
 2019-02-27  Michael Catanzaro  <mcatanzaro@igalia.com>
 
         Unreviewed, fix -Wformat warning
index 4e3d114..0433c99 100644 (file)
@@ -400,10 +400,8 @@ void LocalAuthenticator::getAssertion()
 
         weakThis->continueGetAssertionAfterUserConsented(consent, context, credentialId, userhandle);
     };
-    NSData *idData = selectedCredentialAttributes[(id)kSecAttrApplicationTag];
-    StringView idStringView { static_cast<const LChar*>([idData bytes]), static_cast<unsigned>([idData length]) };
     m_connection->getUserConsent(
-        makeString("Log into ", requestData().requestOptions.rpId, " with ", idStringView, '.'),
+        String::format("Log into %s with %s.", requestData().requestOptions.rpId.utf8().data(), selectedCredentialAttributes[(id)kSecAttrApplicationTag]),
         (__bridge SecAccessControlRef)selectedCredentialAttributes[(id)kSecAttrAccessControl],
         WTFMove(callback));
 #endif // PLATFORM(IOS_FAMILY)
index 1b61b55..d4a781c 100644 (file)
@@ -1,3 +1,10 @@
+2019-02-27  Simon Fraser  <simon.fraser@apple.com>
+
+        Roll out r242014; it caused crashes in compositing logging (webkit.org/b/195141)
+
+        * FullscreenVideoController.cpp:
+        (timeToString):
+
 2019-02-26  Philippe Normand  <pnormand@igalia.com>
 
         [WPE] Add API for webview background color configuration
index 646e6ae..ca50200 100644 (file)
@@ -41,7 +41,6 @@
 #include <WebCore/TextRun.h>
 #include <windowsx.h>
 #include <wtf/StdLibExtras.h>
-#include <wtf/text/StringConcatenateNumbers.h>
 
 #if USE(CA)
 #include <WebCore/PlatformCALayerClient.h>
@@ -471,9 +470,14 @@ static String timeToString(float time)
     int hours = seconds / (60 * 60);
     int minutes = (seconds / 60) % 60;
     seconds %= 60;
-    if (hours)
-        return makeString((time < 0 ? "-" : ""), hours, ':', pad('0', 2, minutes), ':', pad('0', 2, seconds));
-    return makeString((time < 0 ? "-" : ""), pad('0', 2, minutes), ':', pad('0', 2, seconds));
+
+    if (hours) {
+        if (hours > 9)
+            return String::format("%s%02d:%02d:%02d", (time < 0 ? "-" : ""), hours, minutes, seconds);
+        return String::format("%s%01d:%02d:%02d", (time < 0 ? "-" : ""), hours, minutes, seconds);
+    }
+
+    return String::format("%s%02d:%02d", (time < 0 ? "-" : ""), minutes, seconds);
 }
 
 void FullscreenVideoController::draw()