Source/WTF/ChangeLog

 12013-10-04 Darin Adler <darin@apple.com>
 2
 3 text-transform: lowercase is not lang-dependent (Turkish languages : tr,az)
 4 https://bugs.webkit.org/show_bug.cgi?id=21312
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 * wtf/text/StringImpl.cpp:
 9 (WTF::StringImpl::upper): Removed an extra call that would unnecessarily reallocate
 10 a StringImpl in the general non-ASCII case. Added an overload that takes a locale identifier.
 11 (WTF::StringImpl::lower): Ditto.
 12 * wtf/text/StringImpl.h: Ditto.
 13 * wtf/text/WTFString.cpp:
 14 (WTF::String::lower): Ditto.
 15 (WTF::String::upper): Ditto.
 16 * wtf/text/WTFString.h: Ditto. Also deleted the makeLower and makeUpper functions since they
 17 offer no advantages over the lower and upper functions.
 18
1192013-10-02 Brent Fulgham <bfulgham@apple.com>
220
321 [Win] Update solutions and projects to support 64-bit build.

Source/WebCore/ChangeLog

 12013-10-04 Darin Adler <darin@apple.com>
 2
 3 text-transform: lowercase is not lang-dependent (Turkish languages : tr,az)
 4 https://bugs.webkit.org/show_bug.cgi?id=21312
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 Test: fast/text/text-transform-turkish-and-azeri.html
 9
 10 * inspector/DOMPatchSupport.cpp:
 11 (WebCore::DOMPatchSupport::patchNode): Use String::upper instead of String::makeUpper.
 12 * page/EventHandler.cpp:
 13 (WebCore::findDropZone): Use String::lower instead of String::makeLower.
 14 * rendering/RenderText.cpp:
 15 (WebCore::applyTextTransform): Use String::upper and String::lower instead of
 16 String::makeUpper and String::makeLower, and also pass in the locale to each.
 17 * xml/XMLHttpRequest.cpp:
 18 (WebCore::XMLHttpRequest::uppercaseKnownHTTPMethod): Changed this so it doesn't call
 19 upper just to return an already known string constant.
 20
1212013-10-04 Krzysztof Wolanski <k.wolanski@samsung.com>
222
323 [EFL] Enable correct behaviour for deleting regional indicator symbols

Source/WTF/wtf/text/StringImpl.cpp

@@upconvert:
552552
553553 // Do a slower implementation for cases that include non-ASCII characters.
554554 bool error;
555  newImpl = createUninitialized(m_length, data16);
556555 int32_t realLength = Unicode::toUpper(data16, length, source16, m_length, &error);
557556 if (!error && realLength == length)
558557 return newImpl;

@@upconvert:
563562 return newImpl.release();
564563}
565564
566 PassRefPtr<StringImpl> StringImpl::fill(UChar character)
 565RefPtr<StringImpl> StringImpl::lower(const AtomicString& localeIdentifier)
567566{
568  if (!m_length)
 567#if !USE(ICU_UNICODE)
 568 UNUSED_PARAM(localeIdentifier);
 569 return lower();
 570#else
 571 // Use the more-optimized code path most of the time.
 572 if (!(localeIdentifier == "tr" || localeIdentifier == "az"))
 573 return lower();
 574
 575 if (m_length > static_cast<unsigned>(numeric_limits<int32_t>::max()))
 576 CRASH();
 577 int length = m_length;
 578
 579 const UChar* source16 = characters();
 580 UChar* data16;
 581 RefPtr<StringImpl> newString = createUninitialized(length, data16);
 582 UErrorCode status = U_ZERO_ERROR;
 583 int realLength = u_strToLower(data16, length, source16, length, "tr", &status);
 584 if (U_SUCCESS(status) && realLength == length)
 585 return newString;
 586 newString = createUninitialized(realLength, data16);
 587 u_strToLower(data16, realLength, source16, length, "tr", &status);
 588 if (U_FAILURE(status))
569589 return this;
 590 return newString.release();
 591#endif
 592}
570593
 594RefPtr<StringImpl> StringImpl::upper(const AtomicString& localeIdentifier)
 595{
 596#if !USE(ICU_UNICODE)
 597 UNUSED_PARAM(localeIdentifier);
 598 return upper();
 599#else
 600 // Use the more-optimized code path most of the time.
 601 if (!(localeIdentifier == "tr" || localeIdentifier == "az") || find('i') == notFound)
 602 return upper();
 603
 604 if (m_length > static_cast<unsigned>(numeric_limits<int32_t>::max()))
 605 CRASH();
 606 int length = m_length;
 607
 608 const UChar* source16 = characters();
 609 UChar* data16;
 610 RefPtr<StringImpl> newString = createUninitialized(length, data16);
 611 UErrorCode status = U_ZERO_ERROR;
 612 int realLength = u_strToUpper(data16, length, source16, length, "tr", &status);
 613 if (U_SUCCESS(status) && realLength == length)
 614 return newString;
 615 newString = createUninitialized(realLength, data16);
 616 u_strToUpper(data16, realLength, source16, length, "tr", &status);
 617 if (U_FAILURE(status))
 618 return this;
 619 return newString.release();
 620#endif
 621}
 622
 623PassRefPtr<StringImpl> StringImpl::fill(UChar character)
 624{
571625 if (!(character & ~0x7F)) {
572626 LChar* data;
573627 RefPtr<StringImpl> newImpl = createUninitialized(m_length, data);

Source/WTF/wtf/text/StringImpl.h

@@public:
687687
688688 WTF_EXPORT_STRING_API PassRefPtr<StringImpl> lower();
689689 WTF_EXPORT_STRING_API PassRefPtr<StringImpl> upper();
 690 WTF_EXPORT_STRING_API RefPtr<StringImpl> lower(const AtomicString& localeIdentifier);
 691 WTF_EXPORT_STRING_API RefPtr<StringImpl> upper(const AtomicString& localeIdentifier);
690692
691693 WTF_EXPORT_STRING_API PassRefPtr<StringImpl> fill(UChar);
692694 // FIXME: Do we need fill(char) or can we just do the right thing if UChar is ASCII?

Source/WTF/wtf/text/WTFString.cpp

@@String String::upper() const
333333 return m_impl->upper();
334334}
335335
 336String String::lower(const AtomicString& localeIdentifier) const
 337{
 338 if (!m_impl)
 339 return String();
 340 return m_impl->lower(localeIdentifier);
 341}
 342
 343String String::upper(const AtomicString& localeIdentifier) const
 344{
 345 if (!m_impl)
 346 return String();
 347 return m_impl->upper(localeIdentifier);
 348}
 349
336350String String::stripWhiteSpace() const
337351{
338352 if (!m_impl)

Source/WTF/wtf/text/WTFString.h

@@public:
122122 // Construct a string referencing an existing StringImpl.
123123 String(StringImpl* impl) : m_impl(impl) { }
124124 String(PassRefPtr<StringImpl> impl) : m_impl(impl) { }
 125 String(RefPtr<StringImpl>&& impl) : m_impl(impl) { }
125126
126127 // Construct a string from a constant string literal.
127128 WTF_EXPORT_STRING_API String(ASCIILiteral characters);

@@public:
318319 return *this;
319320 }
320321
321  void makeLower() { if (m_impl) m_impl = m_impl->lower(); }
322  void makeUpper() { if (m_impl) m_impl = m_impl->upper(); }
323322 void fill(UChar c) { if (m_impl) m_impl = m_impl->fill(c); }
324323
325324 WTF_EXPORT_STRING_API void truncate(unsigned len);

@@public:
334333 WTF_EXPORT_STRING_API String lower() const;
335334 WTF_EXPORT_STRING_API String upper() const;
336335
 336 WTF_EXPORT_STRING_API String lower(const AtomicString& localeIdentifier) const;
 337 WTF_EXPORT_STRING_API String upper(const AtomicString& localeIdentifier) const;
 338
337339 WTF_EXPORT_STRING_API String stripWhiteSpace() const;
338340 WTF_EXPORT_STRING_API String stripWhiteSpace(IsWhiteSpaceFunctionPtr) const;
339341 WTF_EXPORT_STRING_API String simplifyWhiteSpace() const;

Source/WebCore/inspector/DOMPatchSupport.cpp

@@Node* DOMPatchSupport::patchNode(Node* node, const String& markup, ExceptionCode
142142 oldList.append(createDigest(child, 0));
143143
144144 // Compose the new list.
145  String markupCopy = markup;
146  markupCopy.makeLower();
 145 String markupCopy = markup.lower();
147146 Vector<OwnPtr<Digest> > newList;
148147 for (Node* child = parentNode->firstChild(); child != node; child = child->nextSibling())
149148 newList.append(createDigest(child, 0));

Source/WebCore/page/EventHandler.cpp

@@static bool findDropZone(Node* target, Clipboard* clipboard)
20612061 if (dropZoneStr.isEmpty())
20622062 continue;
20632063
2064  dropZoneStr.makeLower();
 2064 dropZoneStr = dropZoneStr.lower();
20652065
20662066 SpaceSplitString keywords(dropZoneStr, false);
20672067 if (keywords.isEmpty())

Source/WebCore/rendering/RenderText.cpp

@@void applyTextTransform(const RenderStyle* style, String& text, UChar previousCh
13311331 makeCapitalized(&text, previousCharacter);
13321332 break;
13331333 case UPPERCASE:
1334  text.makeUpper();
 1334 text = text.upper(style->locale());
13351335 break;
13361336 case LOWERCASE:
1337  text.makeLower();
 1337 text = text.lower(style->locale());
13381338 break;
13391339 }
13401340}

Source/WebCore/xml/XMLHttpRequest.cpp

@@bool XMLHttpRequest::isAllowedHTTPMethod(const String& method)
452452
453453String XMLHttpRequest::uppercaseKnownHTTPMethod(const String& method)
454454{
455  if (equalIgnoringCase(method, "COPY") || equalIgnoringCase(method, "DELETE") || equalIgnoringCase(method, "GET")
456  || equalIgnoringCase(method, "HEAD") || equalIgnoringCase(method, "INDEX") || equalIgnoringCase(method, "LOCK")
457  || equalIgnoringCase(method, "M-POST") || equalIgnoringCase(method, "MKCOL") || equalIgnoringCase(method, "MOVE")
458  || equalIgnoringCase(method, "OPTIONS") || equalIgnoringCase(method, "POST") || equalIgnoringCase(method, "PROPFIND")
459  || equalIgnoringCase(method, "PROPPATCH") || equalIgnoringCase(method, "PUT") || equalIgnoringCase(method, "UNLOCK")) {
460  return method.upper();
 455 const char* const methods[] = { "COPY", "DELETE", "GET", "HEAD", "INDEX", "LOCK", "M-POST", "MKCOL", "MOVE", "OPTIONS", "POST", "PROPFIND", "PROPPATCH", "PUT", "UNLOCK" };
 456 for (unsigned i = 0; i < WTF_ARRAY_LENGTH(methods); ++i) {
 457 if (equalIgnoringCase(method, methods[i])) {
 458 // Don't bother allocating a new string if it's already all uppercase.
 459 if (method == methods[i])
 460 break;
 461 return ASCIILiteral(methods[i]);
 462 }
461463 }
462464 return method;
463465}

LayoutTests/ChangeLog

 12013-10-04 Darin Adler <darin@apple.com>
 2
 3 text-transform: lowercase is not lang-dependent (Turkish languages : tr,az)
 4 https://bugs.webkit.org/show_bug.cgi?id=21312
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 * fast/text/text-transform-turkish-and-azeri-expected.html: Added.
 9 * fast/text/text-transform-turkish-and-azeri.html: Added.
 10
1112013-10-04 Krzysztof Wolanski <k.wolanski@samsung.com>
212
313 [EFL] Enable correct behaviour for deleting regional indicator symbols

LayoutTests/fast/text/text-transform-turkish-and-azeri-expected.html

 1<!DOCTYPE html>
 2<html>
 3<head><meta charset="utf-8"></head>
 4<body>
 5<p>Turkish uppercasing (each pair should match): İ İ, I I.</p>
 6<p>Turkish lowercasing (each pair should match): i i, i i, ı ı.</p>
 7<p>Azeri uppercasing (each pair should match): İ İ, I I.</p>
 8<p>Azeri lowercasing (each pair should match): i i, i i, ı ı.</p>
 9</body>
 10</html>

LayoutTests/fast/text/text-transform-turkish-and-azeri.html

 1<!DOCTYPE html>
 2<html>
 3<head><meta charset="utf-8"></head>
 4<body>
 5<p>Turkish uppercasing (each pair should match): <span lang="tr" style="text-transform: uppercase">i İ, ı I</span>.</p>
 6<p>Turkish lowercasing (each pair should match): <span lang="tr" style="text-transform: lowercase">İ i, İ i, I ı</span>.</p>
 7<p>Azeri uppercasing (each pair should match): <span lang="az" style="text-transform: uppercase">i İ, ı I</span>.</p>
 8<p>Azeri lowercasing (each pair should match): <span lang="az" style="text-transform: lowercase">İ i, İ i, I ı</span>.</p>
 9</body>
 10</html>