Changeset 195501 in webkit
- Timestamp:
- Jan 22, 2016 6:04:41 PM (8 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r195499 r195501 1 2016-01-20 Ryosuke Niwa <rniwa@webkit.org> 2 3 HTMLElement::nodeName should not upper case non-ASCII characters 4 https://bugs.webkit.org/show_bug.cgi?id=153231 5 6 Reviewed by Darin Adler. 7 8 Added a regression test since the rebaselined W3C test case is very simple and doesn't all permutations. 9 10 * fast/dom/Element/tagName-must-be-ASCII-uppercase-in-HTML-document-expected.txt: Added. 11 * fast/dom/Element/tagName-must-be-ASCII-uppercase-in-HTML-document.html: Added. 12 1 13 2016-01-22 Brady Eidson <beidson@apple.com> 2 14 -
trunk/LayoutTests/imported/w3c/ChangeLog
r195497 r195501 1 2016-01-20 Ryosuke Niwa <rniwa@webkit.org> 2 3 HTMLElement::nodeName should not upper case non-ASCII characters 4 https://bugs.webkit.org/show_bug.cgi?id=153231 5 6 Reviewed by Darin Adler. 7 8 Rebaselined the test now that all test cases pass. 9 10 * web-platform-tests/dom/nodes/Document-createElement-expected.txt: 11 1 12 2016-01-22 Chris Dumez <cdumez@apple.com> 2 13 -
trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-createElement-expected.txt
r195091 r195501 22 22 PASS createElement("marK") 23 23 PASS createElement("İnput") 24 FAIL createElement("ınput") assert_equals: expected "ıNPUT" but got "INPUT" 24 PASS createElement("ınput") 25 25 PASS createElement("") 26 26 PASS createElement("1foo") -
trunk/Source/WTF/ChangeLog
r195458 r195501 1 2016-01-20 Ryosuke Niwa <rniwa@webkit.org> 2 3 HTMLElement::nodeName should not upper case non-ASCII characters 4 https://bugs.webkit.org/show_bug.cgi?id=153231 5 6 Reviewed by Darin Adler. 7 8 Added convertToASCIIUppercase to AtomicString, String, and StringImpl. 9 10 * wtf/text/AtomicString.cpp: 11 (WTF::AtomicString::convertASCIICase): Generalized from convertToASCIILowercase. 12 (WTF::AtomicString::convertToASCIILowercase): 13 (WTF::AtomicString::convertToASCIIUppercase): 14 * wtf/text/AtomicString.h: 15 * wtf/text/StringImpl.cpp: 16 (WTF::StringImpl::convertASCIICase): Generalized from convertToASCIILowercase. 17 (WTF::StringImpl::convertToASCIILowercase): 18 (WTF::StringImpl::convertToASCIIUppercase): 19 * wtf/text/StringImpl.h: 20 * wtf/text/WTFString.cpp: 21 (WTF::String::convertToASCIIUppercase): Added. 22 * wtf/text/WTFString.h: 23 1 24 2016-01-22 Chris Dumez <cdumez@apple.com> 2 25 -
trunk/Source/WTF/wtf/text/AtomicString.cpp
r188169 r195501 49 49 } 50 50 51 AtomicString AtomicString::convertToASCIILowercase() const 51 template<AtomicString::CaseConvertType type> 52 ALWAYS_INLINE AtomicString AtomicString::convertASCIICase() const 52 53 { 53 54 StringImpl* impl = this->impl(); … … 64 65 unsigned failingIndex; 65 66 for (unsigned i = 0; i < length; ++i) { 66 if ( UNLIKELY(isASCIIUpper(characters[i]))) {67 if (type == CaseConvertType::Lower ? UNLIKELY(isASCIIUpper(characters[i])) : LIKELY(isASCIILower(characters[i]))) { 67 68 failingIndex = i; 68 69 goto SlowPath; … … 75 76 localBuffer[i] = characters[i]; 76 77 for (unsigned i = failingIndex; i < length; ++i) 77 localBuffer[i] = t oASCIILower(characters[i]);78 localBuffer[i] = type == CaseConvertType::Lower ? toASCIILower(characters[i]) : toASCIIUpper(characters[i]); 78 79 return AtomicString(localBuffer, length); 79 80 } 80 81 81 Ref Ptr<StringImpl> convertedString = impl->convertToASCIILowercase();82 if (LIKELY(convertedString == impl))82 Ref<StringImpl> convertedString = type == CaseConvertType::Lower ? impl->convertToASCIILowercase() : impl->convertToASCIIUppercase(); 83 if (LIKELY(convertedString.ptr() == impl)) 83 84 return *this; 84 85 85 86 AtomicString result; 86 result.m_string = AtomicStringImpl::add(convertedString. get());87 result.m_string = AtomicStringImpl::add(convertedString.ptr()); 87 88 return result; 89 } 90 91 AtomicString AtomicString::convertToASCIILowercase() const 92 { 93 return convertASCIICase<CaseConvertType::Lower>(); 94 } 95 96 AtomicString AtomicString::convertToASCIIUppercase() const 97 { 98 return convertASCIICase<CaseConvertType::Upper>(); 88 99 } 89 100 -
trunk/Source/WTF/wtf/text/AtomicString.h
r195452 r195501 155 155 156 156 WTF_EXPORT_STRING_API AtomicString convertToASCIILowercase() const; 157 WTF_EXPORT_STRING_API AtomicString convertToASCIIUppercase() const; 157 158 WTF_EXPORT_STRING_API AtomicString lower() const; 158 159 AtomicString upper() const { return AtomicString(impl()->upper()); } … … 186 187 // The explicit constructors with AtomicString::ConstructFromLiteral must be used for literals. 187 188 AtomicString(ASCIILiteral); 189 190 enum class CaseConvertType { Upper, Lower }; 191 template<CaseConvertType> AtomicString convertASCIICase() const; 188 192 189 193 WTF_EXPORT_STRING_API static AtomicString fromUTF8Internal(const char*, const char*); -
trunk/Source/WTF/wtf/text/StringImpl.cpp
r184867 r195501 680 680 } 681 681 682 template<StringImpl::CaseConvertType type, typename CharacterType> 683 ALWAYS_INLINE Ref<StringImpl> StringImpl::convertASCIICase(StringImpl& impl, const CharacterType* data, unsigned length) 684 { 685 unsigned failingIndex; 686 for (unsigned i = 0; i < length; ++i) { 687 CharacterType character = data[i]; 688 if (type == CaseConvertType::Lower ? UNLIKELY(isASCIIUpper(character)) : LIKELY(isASCIILower(character))) { 689 failingIndex = i; 690 goto SlowPath; 691 } 692 } 693 return impl; 694 695 SlowPath: 696 CharacterType* newData; 697 Ref<StringImpl> newImpl = createUninitializedInternalNonEmpty(length, newData); 698 for (unsigned i = 0; i < failingIndex; ++i) 699 newData[i] = data[i]; 700 for (unsigned i = failingIndex; i < length; ++i) 701 newData[i] = type == CaseConvertType::Lower ? toASCIILower(data[i]) : toASCIIUpper(data[i]); 702 return newImpl; 703 } 704 682 705 Ref<StringImpl> StringImpl::convertToASCIILowercase() 683 706 { 684 if (is8Bit()) { 685 unsigned failingIndex; 686 for (unsigned i = 0; i < m_length; ++i) { 687 LChar character = m_data8[i]; 688 if (UNLIKELY(isASCIIUpper(character))) { 689 failingIndex = i; 690 goto SlowPath; 691 } 692 } 693 return *this; 694 695 SlowPath: 696 LChar* data8; 697 Ref<StringImpl> newImpl = createUninitializedInternalNonEmpty(m_length, data8); 698 for (unsigned i = 0; i < failingIndex; ++i) 699 data8[i] = m_data8[i]; 700 for (unsigned i = failingIndex; i < m_length; ++i) 701 data8[i] = toASCIILower(m_data8[i]); 702 return newImpl; 703 } 704 705 bool noUpper = true; 706 for (unsigned i = 0; i < m_length; ++i) { 707 if (UNLIKELY(isASCIIUpper(m_data16[i]))) 708 noUpper = false; 709 } 710 if (noUpper) 711 return *this; 712 713 UChar* data16; 714 Ref<StringImpl> newImpl = createUninitializedInternalNonEmpty(m_length, data16); 715 for (unsigned i = 0; i < m_length; ++i) 716 data16[i] = toASCIILower(m_data16[i]); 717 return newImpl; 707 if (is8Bit()) 708 return convertASCIICase<CaseConvertType::Lower>(*this, m_data8, m_length); 709 return convertASCIICase<CaseConvertType::Lower>(*this, m_data16, m_length); 710 } 711 712 Ref<StringImpl> StringImpl::convertToASCIIUppercase() 713 { 714 if (is8Bit()) 715 return convertASCIICase<CaseConvertType::Upper>(*this, m_data8, m_length); 716 return convertASCIICase<CaseConvertType::Upper>(*this, m_data16, m_length); 718 717 } 719 718 -
trunk/Source/WTF/wtf/text/StringImpl.h
r195452 r195501 677 677 678 678 WTF_EXPORT_STRING_API Ref<StringImpl> convertToASCIILowercase(); 679 WTF_EXPORT_STRING_API Ref<StringImpl> convertToASCIIUppercase(); 679 680 WTF_EXPORT_STRING_API Ref<StringImpl> lower(); 680 681 WTF_EXPORT_STRING_API Ref<StringImpl> upper(); … … 852 853 static const unsigned s_copyCharsInlineCutOff = 20; 853 854 855 enum class CaseConvertType { Upper, Lower }; 856 template<CaseConvertType type, typename CharacterType> static Ref<StringImpl> convertASCIICase(StringImpl&, const CharacterType*, unsigned); 857 854 858 BufferOwnership bufferOwnership() const { return static_cast<BufferOwnership>(m_hashAndFlags & s_hashMaskBufferOwnership); } 855 859 template <class UCharPredicate> Ref<StringImpl> stripMatchedCharacters(UCharPredicate); -
trunk/Source/WTF/wtf/text/WTFString.cpp
r194496 r195501 344 344 } 345 345 346 String String::convertToASCIIUppercase() const 347 { 348 // FIXME: Should this function, and the many others like it, be inlined? 349 if (!m_impl) 350 return String(); 351 return m_impl->convertToASCIIUppercase(); 352 } 353 346 354 String String::lower() const 347 355 { -
trunk/Source/WTF/wtf/text/WTFString.h
r195458 r195501 340 340 WTF_EXPORT_STRING_API String convertToASCIILowercase() const; 341 341 WTF_EXPORT_STRING_API String lower() const; 342 WTF_EXPORT_STRING_API String convertToASCIIUppercase() const; 342 343 WTF_EXPORT_STRING_API String upper() const; 343 344 -
trunk/Source/WebCore/ChangeLog
r195499 r195501 1 2016-01-20 Ryosuke Niwa <rniwa@webkit.org> 2 3 HTMLElement::nodeName should not upper case non-ASCII characters 4 https://bugs.webkit.org/show_bug.cgi?id=153231 5 6 Reviewed by Darin Adler. 7 8 Use the newly added convertToASCIIUppercase to generate the string for tagName and nodeName. 9 10 Test: fast/dom/Element/tagName-must-be-ASCII-uppercase-in-HTML-document.html 11 12 * dom/QualifiedName.cpp: 13 (WebCore::QualifiedName::localNameUpper): Use convertToASCIIUppercase. 14 * html/HTMLElement.cpp: 15 (WebCore::HTMLElement::nodeName): Use convertToASCIIUppercase. 16 1 17 2016-01-22 Brady Eidson <beidson@apple.com> 2 18 -
trunk/Source/WebCore/dom/QualifiedName.cpp
r194819 r195501 124 124 { 125 125 if (!m_impl->m_localNameUpper) 126 m_impl->m_localNameUpper = m_impl->m_localName. upper();126 m_impl->m_localNameUpper = m_impl->m_localName.convertToASCIIUppercase(); 127 127 return m_impl->m_localNameUpper; 128 128 } -
trunk/Source/WebCore/html/HTMLElement.cpp
r195452 r195501 77 77 // ASCII characters that does not have to copy the string on a hit in the hash. 78 78 if (document().isHTMLDocument()) { 79 if ( !tagQName().hasPrefix())79 if (LIKELY(!tagQName().hasPrefix())) 80 80 return tagQName().localNameUpper(); 81 return Element::nodeName(). upper();81 return Element::nodeName().convertToASCIIUppercase(); 82 82 } 83 83 return Element::nodeName();
Note: See TracChangeset
for help on using the changeset viewer.