Title: [196080] trunk/Source
Revision
196080
Author
da...@apple.com
Date
2016-02-03 14:08:57 -0800 (Wed, 03 Feb 2016)

Log Message

Convert another batch of String::lower callsites to something better, typically convertToASCIILowercase
https://bugs.webkit.org/show_bug.cgi?id=153789

Reviewed by Sam Weinig.

Source/WebCore:

* dom/DOMImplementation.cpp:
(WebCore::DOMImplementation::isXMLMIMEType): Use equalLettersIgnoringASCIICase
and the boolean argument to endsWith to ignore ASCII case.
(WebCore::DOMImplementation::isTextMIMEType): Ditto. Also simplified the logic
by removing an if statement.

* dom/Document.cpp:
(WebCore::isSeparator): Deleted. Moved to WindowFeatures.cpp.
(WebCore::processArguments): Ditto.
(WebCore::Document::processViewport): Call the processFeaturesString function
from WindowFeatures.h; the code here was originally just a pasted copy of that code!
(WebCore::Document::processFormatDetection): Ditto.

* html/HTMLCanvasElement.cpp:
(WebCore::HTMLCanvasElement::toEncodingMimeType): Remove now-unneeded
lowercasing of MIME type before calling isSupportedImageMIMETypeForEncoding,
since the MIME type registry now ignores ASCII case. Use convertToASCIILowercase
on the return value, to preserve behavior.
(WebCore::HTMLCanvasElement::toDataURL): Minor coding style tweaks.

* html/HTMLEmbedElement.cpp:
(WebCore::HTMLEmbedElement::parseAttribute): Use convertToASCIILowercase for
the service type here.

* html/HTMLImageElement.cpp:
(WebCore::HTMLImageElement::bestFitSourceFromPictureElement): Remove now-unneeded
lowercasing since MIME type registry now ignores ASCII case. And use
equalLettersIgnoringASCIICase for the case here.

* html/HTMLInputElement.cpp:
(WebCore::parseAcceptAttribute): Use convertToASCIILowercase for the type here.

* html/HTMLLinkElement.cpp:
(WebCore::HTMLLinkElement::parseAttribute): Use convertToASCIILowercase for the
media value here.

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::canPlayType): Use convertToASCIILowercase for the
content type here.
(WebCore::HTMLMediaElement::selectNextSourceChild): Ditto.

* html/HTMLObjectElement.cpp:
(WebCore::HTMLObjectElement::parseAttribute): Use convertToASCIILowercase for
the service type here.

* html/HTMLTrackElement.cpp:
(WebCore::HTMLTrackElement::parseAttribute): Use convertToASCIILowercase for
the kind here.
(WebCore::HTMLTrackElement::ensureTrack): Ditto. Also use fastGetAttribute
since this is neither the style attribute nor an animatable SVG attribute.

* html/parser/HTMLTreeBuilder.cpp:
(WebCore::createCaseMap): Use convertToASCIILowercase for the local names here.

* inspector/DOMPatchSupport.cpp:
(WebCore::DOMPatchSupport::patchNode): Use containsIgnoringASCIICase instead
of combining lower with find == notFound here.
(WebCore::nodeName): Use convertToASCIILowercase here.

* inspector/InspectorOverlay.cpp:
(WebCore::buildObjectForElementData): Use convertToASCIILowercase for node
name here.

* inspector/InspectorPageAgent.cpp:
(WebCore::createXHRTextDecoder): Remove a now-unneeded call to lower since
DOMImplementation::isXMLMIMEType now ignores ASCII case.

* inspector/InspectorStyleSheet.cpp:
(WebCore::lowercasePropertyName): Use convertToASCIILowercase for property
names here. Also use startsWith rather than a hand-written alternative.
(WebCore::InspectorStyle::populateAllProperties): Use the return value of
the add function to avoid doing a double hash table lookp.
(WebCore::InspectorStyle::styleWithProperties): Use convertToASCIILowercase
to lowercase the property name.

* inspector/NetworkResourcesData.cpp:
(WebCore::createOtherResourceTextDecoder): Remove unneeded call to lower since
DOMImplement::isXMLMIMEType now ignores ASCII case.

* loader/CrossOriginAccessControl.cpp:
(WebCore::createAccessControlPreflightRequest): Use convertToASCIILowercase
to lowercase the access control request header field value.

* loader/cache/CachedScript.cpp:
(WebCore::CachedScript::mimeType): Use convertToASCIILowercase on the content type.

* page/CaptionUserPreferencesMediaAF.cpp:
(WebCore::languageIdentifier): Use convertToASCIILowercase on the language code.

* page/DOMWindow.cpp:
(WebCore::DOMWindow::open): Call parseWindowFeatures instead of using the
constructor for WindowFeatures.
(WebCore::DOMWindow::showModalDialog): Call parseDialogFeatures instead of
using the constructor for WindowFeatures.

* page/EventHandler.cpp:
(WebCore::findDropZone): Remove unneeded lowercasing and empty string checking,
and use the option SpaceSplitString already has to convert to lowercase.
(WebCore::EventHandler::handleAccessKey): Remove unneeded call to lower since
getElementByAccessKey now ignores case. Also tweaked coding style a bit.

* page/OriginAccessEntry.cpp:
(WebCore::OriginAccessEntry::OriginAccessEntry): Use convertToASCIILowercase
on the protocol and host.
(WebCore::OriginAccessEntry::matchesOrigin): Ditto.

* page/SecurityOrigin.cpp:
(WebCore::shouldTreatAsUniqueOrigin): Remove unneeded call to lower since
SchemeRegistry now ignores ASCII case.
(WebCore::SecurityOrigin::SecurityOrigin): Use convertToASCIILowercase on
the protocol and host.
(WebCore::SecurityOrigin::setDomainFromDOM): Use convertToASCIILowercase on
the domain.
(WebCore::SecurityOrigin::canDisplay): Remove call to lower since SchemeRegistry
now ignores ASCII case and because this now uses equalIgnoringASCIICase in
one place that used to use exact matching.

* page/WindowFeatures.cpp: Refactored so this is now some helper functions
plus a struct rather than a class.
(WebCore::isSeparator): Renamed this and removed special handling for NUL.
(WebCore::parseWindowFeatures): Moved the code that was formerly in the
WindowFeatures constructor in here. Refactored the parsing into the
processFeaturesString function, shared with the functions in Document that
do the same kind of parsing. Removed the code that converts the entire string
to lowercase before parsing.
(WebCore::processFeaturesString): Moved the improved version of this function
here from Document.cpp; more efficient because it doesn't allocate strings.
(WebCore::setWindowFeature): Changed to be a function private to this file
with internal linkage. Use equalLettersIgnoringASCIICase so we no longer
rely on converting the string to lowercase before parsing.
(WebCore::parseDialogFeatures): Similar refactoring, but also changed all
the default handling to use Optional<> instead of default values.
(WebCore::boolFeature): Changed to use option and to ignore ASCII case.
(WebCore::floatFeature): Ditto.
(WebCore::parseDialogFeaturesMap): Removed the calls to lower, which are
not needed any more.

* page/WindowFeatures.h: Added default values for all the data members,
and removed all the functions from the WindowFeatures struct. Added the two
functions for parsing window and dialog features. Also added the
processFeaturesString function so we can share it with Document.cpp.

* platform/SchemeRegistry.cpp:
(WebCore::SchemeRegistry::removeURLSchemeRegisteredAsLocal): Use
equalLettersIgnoringASCIICase to ignore ASCII case.

* platform/efl/MIMETypeRegistryEfl.cpp:
(WebCore::MIMETypeRegistry::getMIMETypeForExtension): Use a modern for loop,
and equalIgnoringASCIICase rather than calling lower.

* platform/graphics/MediaPlayer.cpp:
(WebCore::MediaPlayer::load): Use convertToASCIILowercase on MIME type and
key system.
(WebCore::MediaPlayer::generateKeyRequest): Ditto.
(WebCore::MediaPlayer::addKey): Ditto.
(WebCore::MediaPlayer::cancelKeyRequest): Ditto.

* platform/graphics/opengl/Extensions3DOpenGLCommon.cpp:
(WebCore::Extensions3DOpenGLCommon::Extensions3DOpenGLCommon): Use
convertToASCIILowercase on vendor string.

* platform/gtk/MIMETypeRegistryGtk.cpp:
(WebCore::MIMETypeRegistry::getMIMETypeForExtension): Use a modern for loop,
and equalIgnoringASCIICase rather than calling lower.

* platform/mac/PasteboardMac.mm:
(WebCore::cocoaTypeFromHTMLClipboardType): Use convertToASCIILowercase
on the type. Also did a bit of renaming and tweaking the logic.

Source/WTF:

* wtf/text/StringView.h:
(WTF::StringView::toInt): Added an overload without the out parameter.

Modified Paths

Diff

Modified: trunk/Source/WTF/ChangeLog (196079 => 196080)


--- trunk/Source/WTF/ChangeLog	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WTF/ChangeLog	2016-02-03 22:08:57 UTC (rev 196080)
@@ -1,3 +1,13 @@
+2016-02-03  Darin Adler  <da...@apple.com>
+
+        Convert another batch of String::lower callsites to something better, typically convertToASCIILowercase
+        https://bugs.webkit.org/show_bug.cgi?id=153789
+
+        Reviewed by Sam Weinig.
+
+        * wtf/text/StringView.h:
+        (WTF::StringView::toInt): Added an overload without the out parameter.
+
 2016-02-03  Michael Catanzaro  <mcatanz...@igalia.com>
 
         [GTK][EFL] Switch FTL to B3

Modified: trunk/Source/WTF/wtf/text/StringView.h (196079 => 196080)


--- trunk/Source/WTF/wtf/text/StringView.h	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WTF/wtf/text/StringView.h	2016-02-03 22:08:57 UTC (rev 196080)
@@ -125,6 +125,7 @@
     WTF_EXPORT_STRING_API bool endsWith(const StringView&) const;
     WTF_EXPORT_STRING_API bool endsWithIgnoringASCIICase(const StringView&) const;
 
+    int toInt() const;
     int toInt(bool& isValid) const;
     int toIntStrict(bool& isValid) const;
     float toFloat(bool& isValid) const;
@@ -455,6 +456,12 @@
     return charactersToFloat(characters16(), length(), &isValid);
 }
 
+inline int StringView::toInt() const
+{
+    bool isValid;
+    return toInt(isValid);
+}
+
 inline int StringView::toInt(bool& isValid) const
 {
     if (is8Bit())

Modified: trunk/Source/WebCore/ChangeLog (196079 => 196080)


--- trunk/Source/WebCore/ChangeLog	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/ChangeLog	2016-02-03 22:08:57 UTC (rev 196080)
@@ -1,3 +1,179 @@
+2016-02-03  Darin Adler  <da...@apple.com>
+
+        Convert another batch of String::lower callsites to something better, typically convertToASCIILowercase
+        https://bugs.webkit.org/show_bug.cgi?id=153789
+
+        Reviewed by Sam Weinig.
+
+        * dom/DOMImplementation.cpp:
+        (WebCore::DOMImplementation::isXMLMIMEType): Use equalLettersIgnoringASCIICase
+        and the boolean argument to endsWith to ignore ASCII case.
+        (WebCore::DOMImplementation::isTextMIMEType): Ditto. Also simplified the logic
+        by removing an if statement.
+
+        * dom/Document.cpp:
+        (WebCore::isSeparator): Deleted. Moved to WindowFeatures.cpp.
+        (WebCore::processArguments): Ditto.
+        (WebCore::Document::processViewport): Call the processFeaturesString function
+        from WindowFeatures.h; the code here was originally just a pasted copy of that code!
+        (WebCore::Document::processFormatDetection): Ditto.
+
+        * html/HTMLCanvasElement.cpp:
+        (WebCore::HTMLCanvasElement::toEncodingMimeType): Remove now-unneeded
+        lowercasing of MIME type before calling isSupportedImageMIMETypeForEncoding,
+        since the MIME type registry now ignores ASCII case. Use convertToASCIILowercase
+        on the return value, to preserve behavior.
+        (WebCore::HTMLCanvasElement::toDataURL): Minor coding style tweaks.
+
+        * html/HTMLEmbedElement.cpp:
+        (WebCore::HTMLEmbedElement::parseAttribute): Use convertToASCIILowercase for
+        the service type here.
+
+        * html/HTMLImageElement.cpp:
+        (WebCore::HTMLImageElement::bestFitSourceFromPictureElement): Remove now-unneeded
+        lowercasing since MIME type registry now ignores ASCII case. And use
+        equalLettersIgnoringASCIICase for the case here.
+
+        * html/HTMLInputElement.cpp:
+        (WebCore::parseAcceptAttribute): Use convertToASCIILowercase for the type here.
+
+        * html/HTMLLinkElement.cpp:
+        (WebCore::HTMLLinkElement::parseAttribute): Use convertToASCIILowercase for the
+        media value here.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::canPlayType): Use convertToASCIILowercase for the
+        content type here.
+        (WebCore::HTMLMediaElement::selectNextSourceChild): Ditto.
+
+        * html/HTMLObjectElement.cpp:
+        (WebCore::HTMLObjectElement::parseAttribute): Use convertToASCIILowercase for
+        the service type here.
+
+        * html/HTMLTrackElement.cpp:
+        (WebCore::HTMLTrackElement::parseAttribute): Use convertToASCIILowercase for
+        the kind here.
+        (WebCore::HTMLTrackElement::ensureTrack): Ditto. Also use fastGetAttribute
+        since this is neither the style attribute nor an animatable SVG attribute.
+
+        * html/parser/HTMLTreeBuilder.cpp:
+        (WebCore::createCaseMap): Use convertToASCIILowercase for the local names here.
+
+        * inspector/DOMPatchSupport.cpp:
+        (WebCore::DOMPatchSupport::patchNode): Use containsIgnoringASCIICase instead
+        of combining lower with find == notFound here.
+        (WebCore::nodeName): Use convertToASCIILowercase here.
+
+        * inspector/InspectorOverlay.cpp:
+        (WebCore::buildObjectForElementData): Use convertToASCIILowercase for node
+        name here.
+
+        * inspector/InspectorPageAgent.cpp:
+        (WebCore::createXHRTextDecoder): Remove a now-unneeded call to lower since
+        DOMImplementation::isXMLMIMEType now ignores ASCII case.
+
+        * inspector/InspectorStyleSheet.cpp:
+        (WebCore::lowercasePropertyName): Use convertToASCIILowercase for property
+        names here. Also use startsWith rather than a hand-written alternative.
+        (WebCore::InspectorStyle::populateAllProperties): Use the return value of
+        the add function to avoid doing a double hash table lookp.
+        (WebCore::InspectorStyle::styleWithProperties): Use convertToASCIILowercase
+        to lowercase the property name.
+
+        * inspector/NetworkResourcesData.cpp:
+        (WebCore::createOtherResourceTextDecoder): Remove unneeded call to lower since
+        DOMImplement::isXMLMIMEType now ignores ASCII case.
+
+        * loader/CrossOriginAccessControl.cpp:
+        (WebCore::createAccessControlPreflightRequest): Use convertToASCIILowercase
+        to lowercase the access control request header field value.
+
+        * loader/cache/CachedScript.cpp:
+        (WebCore::CachedScript::mimeType): Use convertToASCIILowercase on the content type.
+
+        * page/CaptionUserPreferencesMediaAF.cpp:
+        (WebCore::languageIdentifier): Use convertToASCIILowercase on the language code.
+
+        * page/DOMWindow.cpp:
+        (WebCore::DOMWindow::open): Call parseWindowFeatures instead of using the
+        constructor for WindowFeatures.
+        (WebCore::DOMWindow::showModalDialog): Call parseDialogFeatures instead of
+        using the constructor for WindowFeatures.
+
+        * page/EventHandler.cpp:
+        (WebCore::findDropZone): Remove unneeded lowercasing and empty string checking,
+        and use the option SpaceSplitString already has to convert to lowercase.
+        (WebCore::EventHandler::handleAccessKey): Remove unneeded call to lower since
+        getElementByAccessKey now ignores case. Also tweaked coding style a bit.
+
+        * page/OriginAccessEntry.cpp:
+        (WebCore::OriginAccessEntry::OriginAccessEntry): Use convertToASCIILowercase
+        on the protocol and host.
+        (WebCore::OriginAccessEntry::matchesOrigin): Ditto.
+
+        * page/SecurityOrigin.cpp:
+        (WebCore::shouldTreatAsUniqueOrigin): Remove unneeded call to lower since
+        SchemeRegistry now ignores ASCII case.
+        (WebCore::SecurityOrigin::SecurityOrigin): Use convertToASCIILowercase on
+        the protocol and host.
+        (WebCore::SecurityOrigin::setDomainFromDOM): Use convertToASCIILowercase on
+        the domain.
+        (WebCore::SecurityOrigin::canDisplay): Remove call to lower since SchemeRegistry
+        now ignores ASCII case and because this now uses equalIgnoringASCIICase in
+        one place that used to use exact matching.
+
+        * page/WindowFeatures.cpp: Refactored so this is now some helper functions
+        plus a struct rather than a class.
+        (WebCore::isSeparator): Renamed this and removed special handling for NUL.
+        (WebCore::parseWindowFeatures): Moved the code that was formerly in the
+        WindowFeatures constructor in here. Refactored the parsing into the
+        processFeaturesString function, shared with the functions in Document that
+        do the same kind of parsing. Removed the code that converts the entire string
+        to lowercase before parsing.
+        (WebCore::processFeaturesString): Moved the improved version of this function
+        here from Document.cpp; more efficient because it doesn't allocate strings.
+        (WebCore::setWindowFeature): Changed to be a function private to this file
+        with internal linkage. Use equalLettersIgnoringASCIICase so we no longer
+        rely on converting the string to lowercase before parsing.
+        (WebCore::parseDialogFeatures): Similar refactoring, but also changed all
+        the default handling to use Optional<> instead of default values.
+        (WebCore::boolFeature): Changed to use option and to ignore ASCII case.
+        (WebCore::floatFeature): Ditto.
+        (WebCore::parseDialogFeaturesMap): Removed the calls to lower, which are
+        not needed any more.
+
+        * page/WindowFeatures.h: Added default values for all the data members,
+        and removed all the functions from the WindowFeatures struct. Added the two
+        functions for parsing window and dialog features. Also added the
+        processFeaturesString function so we can share it with Document.cpp.
+
+        * platform/SchemeRegistry.cpp:
+        (WebCore::SchemeRegistry::removeURLSchemeRegisteredAsLocal): Use
+        equalLettersIgnoringASCIICase to ignore ASCII case.
+
+        * platform/efl/MIMETypeRegistryEfl.cpp:
+        (WebCore::MIMETypeRegistry::getMIMETypeForExtension): Use a modern for loop,
+        and equalIgnoringASCIICase rather than calling lower.
+
+        * platform/graphics/MediaPlayer.cpp:
+        (WebCore::MediaPlayer::load): Use convertToASCIILowercase on MIME type and
+        key system.
+        (WebCore::MediaPlayer::generateKeyRequest): Ditto.
+        (WebCore::MediaPlayer::addKey): Ditto.
+        (WebCore::MediaPlayer::cancelKeyRequest): Ditto.
+
+        * platform/graphics/opengl/Extensions3DOpenGLCommon.cpp:
+        (WebCore::Extensions3DOpenGLCommon::Extensions3DOpenGLCommon): Use
+        convertToASCIILowercase on vendor string.
+
+        * platform/gtk/MIMETypeRegistryGtk.cpp:
+        (WebCore::MIMETypeRegistry::getMIMETypeForExtension): Use a modern for loop,
+        and equalIgnoringASCIICase rather than calling lower.
+
+        * platform/mac/PasteboardMac.mm:
+        (WebCore::cocoaTypeFromHTMLClipboardType): Use convertToASCIILowercase
+        on the type. Also did a bit of renaming and tweaking the logic.
+
 2016-02-03  Dave Hyatt  <hy...@apple.com>
 
         Implement hanging-punctuation property parsing.

Modified: trunk/Source/WebCore/dom/DOMImplementation.cpp (196079 => 196080)


--- trunk/Source/WebCore/dom/DOMImplementation.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/dom/DOMImplementation.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -268,10 +268,12 @@
 
 bool DOMImplementation::isXMLMIMEType(const String& mimeType)
 {
-    if (mimeType == "text/xml" || mimeType == "application/xml" || mimeType == "text/xsl")
+    // FIXME: Can we move this logic to MIMETypeRegistry and have this just be a single function call?
+
+    if (equalLettersIgnoringASCIICase(mimeType, "text/xml") || equalLettersIgnoringASCIICase(mimeType, "application/xml") || equalLettersIgnoringASCIICase(mimeType, "text/xsl"))
         return true;
 
-    if (!mimeType.endsWith("+xml"))
+    if (!mimeType.endsWith("+xml", false))
         return false;
 
     size_t slashPosition = mimeType.find('/');
@@ -291,13 +293,14 @@
 
 bool DOMImplementation::isTextMIMEType(const String& mimeType)
 {
-    if (MIMETypeRegistry::isSupportedJavaScriptMIMEType(mimeType)
-        || mimeType == "application/json" // Render JSON as text/plain.
-        || (mimeType.startsWith("text/") && mimeType != "text/html"
-            && mimeType != "text/xml" && mimeType != "text/xsl"))
-        return true;
+    // FIXME: Can we move this logic to MIMETypeRegistry and have this just be a single function call?
 
-    return false;
+    return MIMETypeRegistry::isSupportedJavaScriptMIMEType(mimeType)
+        || equalLettersIgnoringASCIICase(mimeType, "application/json") // Render JSON as text/plain.
+        || (mimeType.startsWith("text/", false)
+            && !equalLettersIgnoringASCIICase(mimeType, "text/html")
+            && !equalLettersIgnoringASCIICase(mimeType, "text/xml")
+            && !equalLettersIgnoringASCIICase(mimeType, "text/xsl"));
 }
 
 Ref<HTMLDocument> DOMImplementation::createHTMLDocument(const String& title)

Modified: trunk/Source/WebCore/dom/Document.cpp (196079 => 196080)


--- trunk/Source/WebCore/dom/Document.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/dom/Document.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -168,6 +168,7 @@
 #include "TreeWalker.h"
 #include "VisitedLinkState.h"
 #include "WheelEvent.h"
+#include "WindowFeatures.h"
 #include "XMLDocument.h"
 #include "XMLDocumentParser.h"
 #include "XMLNSNames.h"
@@ -3278,43 +3279,6 @@
     }
 }
 
-static bool isSeparator(UChar character)
-{
-    return character == ' ' || character == '\t' || character == '\n' || character == '\r' || character == '=' || character == ',';
-}
-
-static void processArguments(StringView features, std::function<void(StringView type, StringView value)> callback)
-{
-    unsigned length = features.length();
-    for (unsigned i = 0; i < length; ) {
-        // skip to first non-separator
-        while (i < length && isSeparator(features[i]))
-            ++i;
-        unsigned keyBegin = i;
-
-        // skip to first separator
-        while (i < length && !isSeparator(features[i]))
-            i++;
-        unsigned keyEnd = i;
-
-        // skip to first '=', but don't skip past a ','
-        while (i < length && features[i] != '=' && features[i] != ',')
-            ++i;
-
-        // skip to first non-separator, but don't skip past a ','
-        while (i < length && isSeparator(features[i]) && features[i] != ',')
-            ++i;
-        unsigned valueBegin = i;
-
-        // skip to first separator
-        while (i < length && !isSeparator(features[i]))
-            ++i;
-        unsigned valueEnd = i;
-
-        callback(features.substring(keyBegin, keyEnd - keyBegin), features.substring(valueBegin, valueEnd - valueBegin));
-    }
-}
-
 void Document::processViewport(const String& features, ViewportArguments::Type origin)
 {
     ASSERT(!features.isNull());
@@ -3324,7 +3288,7 @@
 
     m_viewportArguments = ViewportArguments(origin);
 
-    processArguments(features, [this](StringView key, StringView value) {
+    processFeaturesString(features, [this](StringView key, StringView value) {
         setViewportFeature(m_viewportArguments, *this, key, value);
     });
 
@@ -3349,7 +3313,7 @@
 void Document::processFormatDetection(const String& features)
 {
     // FIXME: Find a better place for this function.
-    processArguments(features, [this](StringView key, StringView value) {
+    processFeaturesString(features, [this](StringView key, StringView value) {
         if (equalLettersIgnoringASCIICase(key, "telephone") && equalLettersIgnoringASCIICase(value, "no"))
             setIsTelephoneNumberParsingAllowed(false);
     });

Modified: trunk/Source/WebCore/html/HTMLCanvasElement.cpp (196079 => 196080)


--- trunk/Source/WebCore/html/HTMLCanvasElement.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/html/HTMLCanvasElement.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -480,13 +480,9 @@
 
 String HTMLCanvasElement::toEncodingMimeType(const String& mimeType)
 {
-    String lowercaseMimeType = mimeType.lower();
-
-    // FIXME: Make isSupportedImageMIMETypeForEncoding threadsafe (to allow this method to be used on a worker thread).
-    if (mimeType.isNull() || !MIMETypeRegistry::isSupportedImageMIMETypeForEncoding(lowercaseMimeType))
-        lowercaseMimeType = "image/png";
-
-    return lowercaseMimeType;
+    if (!MIMETypeRegistry::isSupportedImageMIMETypeForEncoding(mimeType))
+        return ASCIILiteral("image/png");
+    return mimeType.convertToASCIILowercase();
 }
 
 String HTMLCanvasElement::toDataURL(const String& mimeType, const double* quality, ExceptionCode& ec)
@@ -499,19 +495,17 @@
     if (m_size.isEmpty() || !buffer())
         return ASCIILiteral("data:,");
 
-    String encodingMimeType = toEncodingMimeType(mimeType);
+    String encodingMIMEType = toEncodingMimeType(mimeType);
 
 #if USE(CG)
     // Try to get ImageData first, as that may avoid lossy conversions.
-    RefPtr<ImageData> imageData = getImageData();
-
-    if (imageData)
-        return ImageDataToDataURL(*imageData, encodingMimeType, quality);
+    if (auto imageData = getImageData())
+        return ImageDataToDataURL(*imageData, encodingMIMEType, quality);
 #endif
 
     makeRenderingResultsAvailable();
 
-    return buffer()->toDataURL(encodingMimeType, quality);
+    return buffer()->toDataURL(encodingMIMEType, quality);
 }
 
 RefPtr<ImageData> HTMLCanvasElement::getImageData()

Modified: trunk/Source/WebCore/html/HTMLEmbedElement.cpp (196079 => 196080)


--- trunk/Source/WebCore/html/HTMLEmbedElement.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/html/HTMLEmbedElement.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -101,7 +101,7 @@
 void HTMLEmbedElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
 {
     if (name == typeAttr) {
-        m_serviceType = value.string().left(value.find(';')).lower();
+        m_serviceType = value.string().left(value.find(';')).convertToASCIILowercase();
         // FIXME: The only difference between this and HTMLObjectElement's corresponding
         // code is that HTMLObjectElement does setNeedsWidgetUpdate(true). Consider moving
         // this up to the HTMLPlugInImageElement to be shared.

Modified: trunk/Source/WebCore/html/HTMLImageElement.cpp (196079 => 196080)


--- trunk/Source/WebCore/html/HTMLImageElement.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/html/HTMLImageElement.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -162,8 +162,7 @@
             if (indexOfSemicolon >= 0)
                 type.truncate(indexOfSemicolon);
             type = stripLeadingAndTrailingHTMLSpaces(type);
-            type = type.lower();
-            if (!type.isEmpty() && !MIMETypeRegistry::isSupportedImageMIMEType(type) && type != "image/svg+xml")
+            if (!type.isEmpty() && !MIMETypeRegistry::isSupportedImageMIMEType(type) && !equalLettersIgnoringASCIICase(type, "image/svg+xml"))
                 continue;
         }
         MediaQueryEvaluator evaluator(document().printing() ? "print" : "screen", document().frame(), document().documentElement() ? document().documentElement()->computedStyle() : nullptr);

Modified: trunk/Source/WebCore/html/HTMLInputElement.cpp (196079 => 196080)


--- trunk/Source/WebCore/html/HTMLInputElement.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/html/HTMLInputElement.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -1229,7 +1229,7 @@
             continue;
         if (!predicate(trimmedType))
             continue;
-        types.append(trimmedType.lower());
+        types.append(trimmedType.convertToASCIILowercase());
     }
 
     return types;

Modified: trunk/Source/WebCore/html/HTMLLinkElement.cpp (196079 => 196080)


--- trunk/Source/WebCore/html/HTMLLinkElement.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/html/HTMLLinkElement.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -164,7 +164,7 @@
         return;
     }
     if (name == mediaAttr) {
-        m_media = value.string().lower();
+        m_media = value.string().convertToASCIILowercase();
         process();
         if (m_sheet && !isDisabled())
             document().styleResolverChanged(DeferRecalcStyle);

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (196079 => 196080)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -920,7 +920,7 @@
 {
     MediaEngineSupportParameters parameters;
     ContentType contentType(mimeType);
-    parameters.type = contentType.type().lower();
+    parameters.type = contentType.type().convertToASCIILowercase();
     parameters.codecs = contentType.parameter(ASCIILiteral("codecs"));
     parameters.url = ""
 #if ENABLE(ENCRYPTED_MEDIA)
@@ -4176,7 +4176,7 @@
 #endif
             MediaEngineSupportParameters parameters;
             ContentType contentType(type);
-            parameters.type = contentType.type().lower();
+            parameters.type = contentType.type().convertToASCIILowercase();
             parameters.codecs = contentType.parameter(ASCIILiteral("codecs"));
             parameters.url = ""
 #if ENABLE(ENCRYPTED_MEDIA)

Modified: trunk/Source/WebCore/html/HTMLObjectElement.cpp (196079 => 196080)


--- trunk/Source/WebCore/html/HTMLObjectElement.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/html/HTMLObjectElement.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -112,7 +112,7 @@
     if (name == formAttr)
         formAttributeChanged();
     else if (name == typeAttr) {
-        m_serviceType = value.string().left(value.find(';')).lower();
+        m_serviceType = value.string().left(value.find(';')).convertToASCIILowercase();
         invalidateRenderer = !fastHasAttribute(classidAttr);
         setNeedsWidgetUpdate(true);
     } else if (name == dataAttr) {

Modified: trunk/Source/WebCore/html/HTMLTrackElement.cpp (196079 => 196080)


--- trunk/Source/WebCore/html/HTMLTrackElement.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/html/HTMLTrackElement.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -102,7 +102,7 @@
         // 4.8.10.12.3 Sourcing out-of-band text tracks
         // As the kind, label, and srclang attributes are set, changed, or removed, the text track must update accordingly...
         } else if (name == kindAttr)
-            track()->setKind(value.lower());
+            track()->setKind(value.convertToASCIILowercase());
         else if (name == labelAttr)
             track()->setLabel(value);
         else if (name == srclangAttr)
@@ -157,8 +157,8 @@
 LoadableTextTrack& HTMLTrackElement::ensureTrack()
 {
     if (!m_track) {
-        // The kind attribute is an enumerated attribute, limited only to know values. It defaults to 'subtitles' if missing or invalid.
-        String kind = getAttribute(kindAttr).lower();
+        // The kind attribute is an enumerated attribute, limited only to known values. It defaults to 'subtitles' if missing or invalid.
+        String kind = fastGetAttribute(kindAttr).convertToASCIILowercase();
         if (!TextTrack::isValidKindKeyword(kind))
             kind = TextTrack::subtitlesKeyword();
         m_track = LoadableTextTrack::create(this, kind, label(), srclang());

Modified: trunk/Source/WebCore/html/parser/HTMLTreeBuilder.cpp (196079 => 196080)


--- trunk/Source/WebCore/html/parser/HTMLTreeBuilder.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/html/parser/HTMLTreeBuilder.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -511,7 +511,7 @@
     for (unsigned i = 0; i < length; ++i) {
         const QualifiedName& name = *names[i];
         const AtomicString& localName = name.localName();
-        AtomicString loweredLocalName = localName.lower();
+        AtomicString loweredLocalName = localName.convertToASCIILowercase();
         if (loweredLocalName != localName)
             map.add(loweredLocalName, name);
     }

Modified: trunk/Source/WebCore/inspector/DOMPatchSupport.cpp (196079 => 196080)


--- trunk/Source/WebCore/inspector/DOMPatchSupport.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/inspector/DOMPatchSupport.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -136,14 +136,13 @@
         oldList.append(createDigest(child, nullptr));
 
     // Compose the new list.
-    String markupCopy = markup.lower();
     Vector<std::unique_ptr<Digest>> newList;
     for (Node* child = parentNode->firstChild(); child != &node; child = child->nextSibling())
         newList.append(createDigest(child, nullptr));
     for (Node* child = fragment->firstChild(); child; child = child->nextSibling()) {
-        if (child->hasTagName(headTag) && !child->firstChild() && markupCopy.find("</head>") == notFound)
+        if (child->hasTagName(headTag) && !child->firstChild() && !markup.containsIgnoringASCIICase("</head>"))
             continue; // HTML5 parser inserts empty <head> tag whenever it parses <body>
-        if (child->hasTagName(bodyTag) && !child->firstChild() && markupCopy.find("</body>") == notFound)
+        if (child->hasTagName(bodyTag) && !child->firstChild() && !markup.containsIgnoringASCIICase("</body>"))
             continue; // HTML5 parser inserts empty <body> tag whenever it parses </head>
         newList.append(createDigest(child, &m_unusedNodesMap));
     }
@@ -496,11 +495,12 @@
 }
 
 #ifdef DEBUG_DOM_PATCH_SUPPORT
+
 static String nodeName(Node* node)
 {
     if (node->document().isXHTMLDocument())
          return node->nodeName();
-    return node->nodeName().lower();
+    return node->nodeName().convertToASCIILowercase();
 }
 
 void DOMPatchSupport::dumpMap(const ResultMap& map, const String& name)
@@ -509,6 +509,7 @@
     for (size_t i = 0; i < map.size(); ++i)
         fprintf(stderr, "%s[%lu]: %s (%p) - [%lu]\n", name.utf8().data(), i, map[i].first ? nodeName(map[i].first->m_node).utf8().data() : "", map[i].first, map[i].second);
 }
+
 #endif
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/inspector/InspectorOverlay.cpp (196079 => 196080)


--- trunk/Source/WebCore/inspector/InspectorOverlay.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/inspector/InspectorOverlay.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -709,7 +709,7 @@
     Element& element = *effectiveElement;
     bool isXHTML = element.document().isXHTMLDocument();
     auto elementData = Inspector::Protocol::OverlayTypes::ElementData::create()
-        .setTagName(isXHTML ? element.nodeName() : element.nodeName().lower())
+        .setTagName(isXHTML ? element.nodeName() : element.nodeName().convertToASCIILowercase())
         .setIdValue(element.getIdAttribute())
         .release();
 

Modified: trunk/Source/WebCore/inspector/InspectorPageAgent.cpp (196079 => 196080)


--- trunk/Source/WebCore/inspector/InspectorPageAgent.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/inspector/InspectorPageAgent.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -123,7 +123,7 @@
     RefPtr<TextResourceDecoder> decoder;
     if (!textEncodingName.isEmpty())
         decoder = TextResourceDecoder::create("text/plain", textEncodingName);
-    else if (DOMImplementation::isXMLMIMEType(mimeType.lower())) {
+    else if (DOMImplementation::isXMLMIMEType(mimeType)) {
         decoder = TextResourceDecoder::create("application/xml");
         decoder->useLenientXMLDecoding();
     } else if (equalLettersIgnoringASCIICase(mimeType, "text/html"))

Modified: trunk/Source/WebCore/inspector/InspectorStyleSheet.cpp (196079 => 196080)


--- trunk/Source/WebCore/inspector/InspectorStyleSheet.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/inspector/InspectorStyleSheet.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -350,9 +350,9 @@
 static String lowercasePropertyName(const String& name)
 {
     // Custom properties are case-sensitive.
-    if (name.length() > 2 && name.characterAt(0) == '-' && name.characterAt(1) == '-')
+    if (name.startsWith("--"))
         return name;
-    return name.lower();
+    return name.convertToASCIILowercase();
 }
 
 bool InspectorStyle::populateAllProperties(Vector<InspectorStyleProperty>* result) const
@@ -375,11 +375,8 @@
 
     for (int i = 0, size = m_style->length(); i < size; ++i) {
         String name = m_style->item(i);
-        String lowerName = lowercasePropertyName(name);
-        if (sourcePropertyNames.contains(lowerName))
-            continue;
-        sourcePropertyNames.add(lowerName);
-        result->append(InspectorStyleProperty(CSSPropertySourceData(name, m_style->getPropertyValue(name), !m_style->getPropertyPriority(name).isEmpty(), true, SourceRange()), false, false));
+        if (sourcePropertyNames.add(lowercasePropertyName(name)))
+            result->append(InspectorStyleProperty(CSSPropertySourceData(name, m_style->getPropertyValue(name), !m_style->getPropertyPriority(name).isEmpty(), true, SourceRange()), false, false));
     }
 
     return true;
@@ -413,7 +410,7 @@
         status = it->disabled ? Inspector::Protocol::CSS::CSSPropertyStatus::Disabled : Inspector::Protocol::CSS::CSSPropertyStatus::Active;
 
         RefPtr<Inspector::Protocol::CSS::CSSProperty> property = Inspector::Protocol::CSS::CSSProperty::create()
-            .setName(name.lower())
+            .setName(name.convertToASCIILowercase())
             .setValue(propertyEntry.value)
             .release();
 

Modified: trunk/Source/WebCore/inspector/NetworkResourcesData.cpp (196079 => 196080)


--- trunk/Source/WebCore/inspector/NetworkResourcesData.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/inspector/NetworkResourcesData.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -141,7 +141,7 @@
     RefPtr<TextResourceDecoder> decoder;
     if (!textEncodingName.isEmpty())
         decoder = TextResourceDecoder::create("text/plain", textEncodingName);
-    else if (DOMImplementation::isXMLMIMEType(mimeType.lower())) {
+    else if (DOMImplementation::isXMLMIMEType(mimeType)) {
         decoder = TextResourceDecoder::create("application/xml");
         decoder->useLenientXMLDecoding();
     } else if (equalLettersIgnoringASCIICase(mimeType, "text/html"))

Modified: trunk/Source/WebCore/loader/CrossOriginAccessControl.cpp (196079 => 196080)


--- trunk/Source/WebCore/loader/CrossOriginAccessControl.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/loader/CrossOriginAccessControl.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -127,7 +127,7 @@
             headerBuffer.append(headerField.key);
         }
 
-        preflightRequest.setHTTPHeaderField(HTTPHeaderName::AccessControlRequestHeaders, headerBuffer.toString().lower());
+        preflightRequest.setHTTPHeaderField(HTTPHeaderName::AccessControlRequestHeaders, headerBuffer.toString().convertToASCIILowercase());
     }
 
     return preflightRequest;

Modified: trunk/Source/WebCore/loader/cache/CachedScript.cpp (196079 => 196080)


--- trunk/Source/WebCore/loader/cache/CachedScript.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/loader/cache/CachedScript.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -66,7 +66,7 @@
 
 String CachedScript::mimeType() const
 {
-    return extractMIMETypeFromMediaType(m_response.httpHeaderField(HTTPHeaderName::ContentType)).lower();
+    return extractMIMETypeFromMediaType(m_response.httpHeaderField(HTTPHeaderName::ContentType)).convertToASCIILowercase();
 }
 
 StringView CachedScript::script()

Modified: trunk/Source/WebCore/page/CaptionUserPreferencesMediaAF.cpp (196079 => 196080)


--- trunk/Source/WebCore/page/CaptionUserPreferencesMediaAF.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/page/CaptionUserPreferencesMediaAF.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -593,7 +593,7 @@
     if (languageCode.isEmpty())
         return languageCode;
 
-    String lowercaseLanguageCode = languageCode.lower();
+    String lowercaseLanguageCode = languageCode.convertToASCIILowercase();
 
     // Need 2U here to disambiguate String::operator[] from operator(NSString*, int)[] in a production build.
     if (lowercaseLanguageCode.length() >= 3 && (lowercaseLanguageCode[2U] == '_' || lowercaseLanguageCode[2U] == '-'))

Modified: trunk/Source/WebCore/page/DOMWindow.cpp (196079 => 196080)


--- trunk/Source/WebCore/page/DOMWindow.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/page/DOMWindow.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -2217,8 +2217,7 @@
         return targetFrame->document()->domWindow();
     }
 
-    WindowFeatures windowFeatures(windowFeaturesString);
-    RefPtr<Frame> result = createWindow(urlString, frameName, windowFeatures, activeWindow, *firstFrame, *m_frame);
+    RefPtr<Frame> result = createWindow(urlString, frameName, parseWindowFeatures(windowFeaturesString), activeWindow, *firstFrame, *m_frame);
     return result ? result->document()->domWindow() : nullptr;
 }
 
@@ -2245,8 +2244,7 @@
     if (!canShowModalDialogNow(m_frame) || !firstWindow.allowPopUp())
         return;
 
-    WindowFeatures windowFeatures(dialogFeaturesString, screenAvailableRect(m_frame->view()));
-    RefPtr<Frame> dialogFrame = createWindow(urlString, emptyAtom, windowFeatures, activeWindow, *firstFrame, *m_frame, WTFMove(prepareDialogFunction));
+    RefPtr<Frame> dialogFrame = createWindow(urlString, emptyAtom, parseDialogFeatures(dialogFeaturesString, screenAvailableRect(m_frame->view())), activeWindow, *firstFrame, *m_frame, WTFMove(prepareDialogFunction));
     if (!dialogFrame)
         return;
     dialogFrame->page()->chrome().runModal();

Modified: trunk/Source/WebCore/page/EventHandler.cpp (196079 => 196080)


--- trunk/Source/WebCore/page/EventHandler.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/page/EventHandler.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -2166,27 +2166,16 @@
     ASSERT(target);
     Element* element = is<Element>(*target) ? downcast<Element>(target) : target->parentElement();
     for (; element; element = element->parentElement()) {
+        SpaceSplitString keywords(element->fastGetAttribute(webkitdropzoneAttr), true);
         bool matched = false;
-        String dropZoneStr = element->fastGetAttribute(webkitdropzoneAttr);
-
-        if (dropZoneStr.isEmpty())
-            continue;
-        
-        dropZoneStr = dropZoneStr.lower();
-        
-        SpaceSplitString keywords(dropZoneStr, false);
-        if (keywords.isEmpty())
-            continue;
-        
         DragOperation dragOperation = DragOperationNone;
-        for (unsigned int i = 0; i < keywords.size(); i++) {
+        for (unsigned i = 0, size = keywords.size(); i < size; ++i) {
             DragOperation op = convertDropZoneOperationToDragOperation(keywords[i]);
             if (op != DragOperationNone) {
                 if (dragOperation == DragOperationNone)
                     dragOperation = op;
             } else
                 matched = matched || hasDropZoneType(*dataTransfer, keywords[i].string());
-
             if (matched && dragOperation != DragOperationNone)
                 break;
         }
@@ -2913,20 +2902,19 @@
     }
 }
 
-bool EventHandler::handleAccessKey(const PlatformKeyboardEvent& evt)
+bool EventHandler::handleAccessKey(const PlatformKeyboardEvent& event)
 {
     // FIXME: Ignoring the state of Shift key is what neither IE nor Firefox do.
     // IE matches lower and upper case access keys regardless of Shift key state - but if both upper and
     // lower case variants are present in a document, the correct element is matched based on Shift key state.
     // Firefox only matches an access key if Shift is not pressed, and does that case-insensitively.
     ASSERT(!(accessKeyModifiers() & PlatformEvent::ShiftKey));
-    if ((evt.modifiers() & ~PlatformEvent::ShiftKey) != accessKeyModifiers())
+    if ((event.modifiers() & ~PlatformEvent::ShiftKey) != accessKeyModifiers())
         return false;
-    String key = evt.unmodifiedText();
-    Element* elem = m_frame.document()->getElementByAccessKey(key.lower());
-    if (!elem)
+    Element* element = m_frame.document()->getElementByAccessKey(event.unmodifiedText());
+    if (!element)
         return false;
-    elem->accessKeyAction(false);
+    element->accessKeyAction(false);
     return true;
 }
 

Modified: trunk/Source/WebCore/page/OriginAccessEntry.cpp (196079 => 196080)


--- trunk/Source/WebCore/page/OriginAccessEntry.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/page/OriginAccessEntry.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -36,8 +36,8 @@
 namespace WebCore {
     
 OriginAccessEntry::OriginAccessEntry(const String& protocol, const String& host, SubdomainSetting subdomainSetting)
-    : m_protocol(protocol.lower())
-    , m_host(host.lower())
+    : m_protocol(protocol.convertToASCIILowercase())
+    , m_host(host.convertToASCIILowercase())
     , m_subdomainSettings(subdomainSetting)
 {
     ASSERT(subdomainSetting == AllowSubdomains || subdomainSetting == DisallowSubdomains);
@@ -48,8 +48,8 @@
 
 bool OriginAccessEntry::matchesOrigin(const SecurityOrigin& origin) const
 {
-    ASSERT(origin.host() == origin.host().lower());
-    ASSERT(origin.protocol() == origin.protocol().lower());
+    ASSERT(origin.host() == origin.host().convertToASCIILowercase());
+    ASSERT(origin.protocol() == origin.protocol().convertToASCIILowercase());
 
     if (m_protocol != origin.protocol())
         return false;

Modified: trunk/Source/WebCore/page/SecurityOrigin.cpp (196079 => 196080)


--- trunk/Source/WebCore/page/SecurityOrigin.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/page/SecurityOrigin.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -97,11 +97,7 @@
     if (schemeRequiresHost(innerURL) && innerURL.host().isEmpty())
         return true;
 
-    // SchemeRegistry needs a lower case protocol because it uses HashMaps
-    // that assume the scheme has already been canonicalized.
-    String protocol = innerURL.protocol().lower();
-
-    if (SchemeRegistry::shouldTreatURLSchemeAsNoAccess(protocol))
+    if (SchemeRegistry::shouldTreatURLSchemeAsNoAccess(innerURL.protocol()))
         return true;
 
     // This is the common case.
@@ -109,8 +105,8 @@
 }
 
 SecurityOrigin::SecurityOrigin(const URL& url)
-    : m_protocol(url.protocol().isNull() ? emptyString() : url.protocol().lower())
-    , m_host(url.host().isNull() ? emptyString() : url.host().lower())
+    : m_protocol(url.protocol().isNull() ? emptyString() : url.protocol().convertToASCIILowercase())
+    , m_host(url.host().isNull() ? emptyString() : url.host().convertToASCIILowercase())
     , m_port(url.port())
     , m_isUnique(false)
     , m_universalAccess(false)
@@ -203,7 +199,7 @@
 void SecurityOrigin::setDomainFromDOM(const String& newDomain)
 {
     m_domainWasSetInDOM = true;
-    m_domain = newDomain.lower();
+    m_domain = newDomain.convertToASCIILowercase();
 }
 
 bool SecurityOrigin::isSecure(const URL& url)
@@ -354,16 +350,16 @@
     if (m_universalAccess)
         return true;
 
-    String protocol = url.protocol().lower();
-
     if (isFeedWithNestedProtocolInHTTPFamily(url))
         return true;
 
+    String protocol = url.protocol();
+
     if (SchemeRegistry::canDisplayOnlyIfCanRequest(protocol))
         return canRequest(url);
 
     if (SchemeRegistry::shouldTreatURLSchemeAsDisplayIsolated(protocol))
-        return m_protocol == protocol || SecurityPolicy::isAccessToURLWhiteListed(this, url);
+        return equalIgnoringASCIICase(m_protocol, protocol) || SecurityPolicy::isAccessToURLWhiteListed(this, url);
 
     if (SecurityPolicy::restrictAccessToLocal() && SchemeRegistry::shouldTreatURLSchemeAsLocal(protocol))
         return canLoadLocalResources() || SecurityPolicy::isAccessToURLWhiteListed(this, url);

Modified: trunk/Source/WebCore/page/WindowFeatures.cpp (196079 => 196080)


--- trunk/Source/WebCore/page/WindowFeatures.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/page/WindowFeatures.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -25,142 +25,124 @@
 
 #include "FloatRect.h"
 #include <wtf/Assertions.h>
+#include <wtf/HashMap.h>
 #include <wtf/MathExtras.h>
 #include <wtf/text/StringHash.h>
 
 namespace WebCore {
 
-// Though isspace() considers \t and \v to be whitespace, Win IE doesn't when parsing window features.
-static bool isWindowFeaturesSeparator(UChar c)
+typedef HashMap<String, String, ASCIICaseInsensitiveHash> DialogFeaturesMap;
+
+static void setWindowFeature(WindowFeatures&, StringView key, StringView value);
+
+static DialogFeaturesMap parseDialogFeaturesMap(const String&);
+static Optional<bool> boolFeature(const DialogFeaturesMap&, const char* key);
+static Optional<float> floatFeature(const DialogFeaturesMap&, const char* key, float min, float max);
+
+static bool isSeparator(UChar character)
 {
-    return c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '=' || c == ',' || c == '\0';
+    return character == ' ' || character == '\t' || character == '\n' || character == '\r' || character == '=' || character == ',';
 }
 
-WindowFeatures::WindowFeatures(const String& features)
-    : resizable(true)
-    , fullscreen(false)
-    , dialog(false)
+WindowFeatures parseWindowFeatures(StringView featuresString)
 {
-    /*
-     The IE rule is: all features except for channelmode and fullscreen default to YES, but
-     if the user specifies a feature string, all features default to NO. (There is no public
-     standard that applies to this method.)
+    // The IE rule is: all features except for channelmode and fullscreen default to YES, but
+    // if the user specifies a feature string, all features default to NO. (There is no public
+    // standard that applies to this method.)
+    //
+    // <http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/open_0.asp>
+    // We always allow a window to be resized, which is consistent with Firefox.
 
-     <http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/open_0.asp>
-     We always allow a window to be resized, which is consistent with Firefox.
-     */
+    WindowFeatures features;
 
-    if (features.isEmpty()) {
-        menuBarVisible = true;
-        statusBarVisible = true;
-        toolBarVisible = true;
-        locationBarVisible = true;
-        scrollbarsVisible = true;
-        return;
-    }
+    if (featuresString.isEmpty())
+        return features;
 
-    menuBarVisible = false;
-    statusBarVisible = false;
-    toolBarVisible = false;
-    locationBarVisible = false;
-    scrollbarsVisible = false;
+    features.menuBarVisible = false;
+    features.statusBarVisible = false;
+    features.toolBarVisible = false;
+    features.locationBarVisible = false;
+    features.scrollbarsVisible = false;
 
-    // Tread lightly in this code -- it was specifically designed to mimic Win IE's parsing behavior.
-    unsigned keyBegin, keyEnd;
-    unsigned valueBegin, valueEnd;
+    processFeaturesString(featuresString, [&features](StringView key, StringView value) {
+        setWindowFeature(features, key, value);
+    });
 
-    String buffer = features.lower();
-    unsigned length = buffer.length();
+    return features;
+}
+
+void processFeaturesString(StringView features, std::function<void(StringView type, StringView value)> callback)
+{
+    unsigned length = features.length();
     for (unsigned i = 0; i < length; ) {
-        // skip to first non-separator, but don't skip past the end of the string
-        while (isWindowFeaturesSeparator(buffer[i])) {
-            if (i >= length)
-                break;
-            i++;
-        }
-        keyBegin = i;
+        // skip to first non-separator
+        while (i < length && isSeparator(features[i]))
+            ++i;
+        unsigned keyBegin = i;
 
         // skip to first separator
-        while (!isWindowFeaturesSeparator(buffer[i]))
+        while (i < length && !isSeparator(features[i]))
             i++;
-        keyEnd = i;
+        unsigned keyEnd = i;
 
-        // skip to first '=', but don't skip past a ',' or the end of the string
-        while (buffer[i] != '=') {
-            if (buffer[i] == ',' || i >= length)
-                break;
-            i++;
-        }
+        // skip to first '=', but don't skip past a ','
+        while (i < length && features[i] != '=' && features[i] != ',')
+            ++i;
 
-        // skip to first non-separator, but don't skip past a ',' or the end of the string
-        while (isWindowFeaturesSeparator(buffer[i])) {
-            if (buffer[i] == ',' || i >= length)
-                break;
-            i++;
-        }
-        valueBegin = i;
+        // skip to first non-separator, but don't skip past a ','
+        while (i < length && isSeparator(features[i]) && features[i] != ',')
+            ++i;
+        unsigned valueBegin = i;
 
         // skip to first separator
-        while (!isWindowFeaturesSeparator(buffer[i]))
-            i++;
-        valueEnd = i;
+        while (i < length && !isSeparator(features[i]))
+            ++i;
+        unsigned valueEnd = i;
 
-        ASSERT_WITH_SECURITY_IMPLICATION(i <= length);
-
-        String keyString(buffer.substring(keyBegin, keyEnd - keyBegin));
-        String valueString(buffer.substring(valueBegin, valueEnd - valueBegin));
-        setWindowFeature(keyString, valueString);
+        callback(features.substring(keyBegin, keyEnd - keyBegin), features.substring(valueBegin, valueEnd - valueBegin));
     }
 }
 
-void WindowFeatures::setWindowFeature(const String& keyString, const String& valueString)
+static void setWindowFeature(WindowFeatures& features, StringView key, StringView value)
 {
-    int value;
-
     // Listing a key with no value is shorthand for key=yes
-    if (valueString.isEmpty() || valueString == "yes")
-        value = 1;
+    int numericValue;
+    if (value.isEmpty() || equalLettersIgnoringASCIICase(value, "yes"))
+        numericValue = 1;
     else
-        value = valueString.toInt();
+        numericValue = value.toInt();
 
-    // We treat keyString of "resizable" here as an additional feature rather than setting resizeable to true.
+    // We treat key of "resizable" here as an additional feature rather than setting resizeable to true.
     // This is consistent with Firefox, but could also be handled at another level.
 
-    if (keyString == "left" || keyString == "screenx")
-        x = value;
-    else if (keyString == "top" || keyString == "screeny")
-        y = value;
-    else if (keyString == "width" || keyString == "innerwidth")
-        width = value;
-    else if (keyString == "height" || keyString == "innerheight")
-        height = value;
-    else if (keyString == "menubar")
-        menuBarVisible = value;
-    else if (keyString == "toolbar")
-        toolBarVisible = value;
-    else if (keyString == "location")
-        locationBarVisible = value;
-    else if (keyString == "status")
-        statusBarVisible = value;
-    else if (keyString == "fullscreen")
-        fullscreen = value;
-    else if (keyString == "scrollbars")
-        scrollbarsVisible = value;
-    else if (value == 1)
-        additionalFeatures.append(keyString);
+    if (equalLettersIgnoringASCIICase(key, "left") || equalLettersIgnoringASCIICase(key, "screenx"))
+        features.x = numericValue;
+    else if (equalLettersIgnoringASCIICase(key, "top") || equalLettersIgnoringASCIICase(key, "screeny"))
+        features.y = numericValue;
+    else if (equalLettersIgnoringASCIICase(key, "width") || equalLettersIgnoringASCIICase(key, "innerwidth"))
+        features.width = numericValue;
+    else if (equalLettersIgnoringASCIICase(key, "height") || equalLettersIgnoringASCIICase(key, "innerheight"))
+        features.height = numericValue;
+    else if (equalLettersIgnoringASCIICase(key, "menubar"))
+        features.menuBarVisible = numericValue;
+    else if (equalLettersIgnoringASCIICase(key, "toolbar"))
+        features.toolBarVisible = numericValue;
+    else if (equalLettersIgnoringASCIICase(key, "location"))
+        features.locationBarVisible = numericValue;
+    else if (equalLettersIgnoringASCIICase(key, "status"))
+        features.statusBarVisible = numericValue;
+    else if (equalLettersIgnoringASCIICase(key, "fullscreen"))
+        features.fullscreen = numericValue;
+    else if (equalLettersIgnoringASCIICase(key, "scrollbars"))
+        features.scrollbarsVisible = numericValue;
+    else if (numericValue == 1)
+        features.additionalFeatures.append(key.toString());
 }
 
-WindowFeatures::WindowFeatures(const String& dialogFeaturesString, const FloatRect& screenAvailableRect)
-    : menuBarVisible(false)
-    , toolBarVisible(false)
-    , locationBarVisible(false)
-    , fullscreen(false)
-    , dialog(true)
+WindowFeatures parseDialogFeatures(const String& dialogFeaturesString, const FloatRect& screenAvailableRect)
 {
-    auto features = parseDialogFeatures(dialogFeaturesString);
+    auto featuresMap = parseDialogFeaturesMap(dialogFeaturesString);
 
-    const bool trusted = false;
-
     // The following features from Microsoft's documentation are not implemented:
     // - default font settings
     // - width, height, left, and top specified in units other than "px"
@@ -169,52 +151,61 @@
     // - help: boolFeature(features, "help", true), makes help icon appear in dialog (what does it do on Windows?)
     // - unadorned: trusted && boolFeature(features, "unadorned");
 
-    width = floatFeature(features, "dialogwidth", 100, screenAvailableRect.width(), 620); // default here came from frame size of dialog in MacIE
-    height = floatFeature(features, "dialogheight", 100, screenAvailableRect.height(), 450); // default here came from frame size of dialog in MacIE
+    WindowFeatures features;
 
-    auto dialogLeft = floatFeature(features, "dialogleft", screenAvailableRect.x(), screenAvailableRect.maxX() - *width, -1);
-    if (dialogLeft > 0)
-        x = dialogLeft;
+    features.menuBarVisible = false;
+    features.toolBarVisible = false;
+    features.locationBarVisible = false;
+    features.dialog = true;
 
-    auto dialogTop = floatFeature(features, "dialogtop", screenAvailableRect.y(), screenAvailableRect.maxY() - *height, -1);
-    if (dialogTop > 0)
-        y = dialogTop;
+    float width = floatFeature(featuresMap, "dialogwidth", 100, screenAvailableRect.width()).valueOr(620); // default here came from frame size of dialog in MacIE
+    float height = floatFeature(featuresMap, "dialogheight", 100, screenAvailableRect.height()).valueOr(450); // default here came from frame size of dialog in MacIE
 
-    if (boolFeature(features, "center", true)) {
-        if (!x)
-            x = screenAvailableRect.x() + (screenAvailableRect.width() - *width) / 2;
+    features.width = width;
+    features.height = height;
 
-        if (!y)
-            y = screenAvailableRect.y() + (screenAvailableRect.height() - *height) / 2;
+    features.x = floatFeature(featuresMap, "dialogleft", screenAvailableRect.x(), screenAvailableRect.maxX() - width);
+    features.y = floatFeature(featuresMap, "dialogtop", screenAvailableRect.y(), screenAvailableRect.maxY() - height);
+
+    if (boolFeature(featuresMap, "center").valueOr(true)) {
+        if (!features.x)
+            features.x = screenAvailableRect.x() + (screenAvailableRect.width() - width) / 2;
+        if (!features.y)
+            features.y = screenAvailableRect.y() + (screenAvailableRect.height() - height) / 2;
     }
 
-    resizable = boolFeature(features, "resizable");
-    scrollbarsVisible = boolFeature(features, "scroll", true);
-    statusBarVisible = boolFeature(features, "status", !trusted);
+    features.resizable = boolFeature(featuresMap, "resizable").valueOr(false);
+    features.scrollbarsVisible = boolFeature(featuresMap, "scroll").valueOr(true);
+    features.statusBarVisible = boolFeature(featuresMap, "status").valueOr(false);
+
+    return features;
 }
 
-bool WindowFeatures::boolFeature(const HashMap<String, String>& features, const char* key, bool defaultValue)
+static Optional<bool> boolFeature(const DialogFeaturesMap& features, const char* key)
 {
     auto it = features.find(key);
     if (it == features.end())
-        return defaultValue;
+        return Nullopt;
 
-    const String& value = it->value;
-    return value.isNull() || value == "1" || value == "yes" || value == "on";
+    auto& value = it->value;
+    return value.isNull()
+        || value == "1"
+        || equalLettersIgnoringASCIICase(value, "yes")
+        || equalLettersIgnoringASCIICase(value, "on");
 }
 
-float WindowFeatures::floatFeature(const HashMap<String, String>& features, const char* key, float min, float max, float defaultValue)
+static Optional<float> floatFeature(const DialogFeaturesMap& features, const char* key, float min, float max)
 {
     auto it = features.find(key);
     if (it == features.end())
-        return defaultValue;
+        return Nullopt;
 
     // FIXME: The toDouble function does not offer a way to tell "0q" from string with no digits in it: Both
     // return the number 0 and false for ok. But "0q" should yield the minimum rather than the default.
     bool ok;
     double parsedNumber = it->value.toDouble(&ok);
     if ((!parsedNumber && !ok) || std::isnan(parsedNumber))
-        return defaultValue;
+        return Nullopt;
     if (parsedNumber < min || max <= min)
         return min;
     if (parsedNumber > max)
@@ -224,10 +215,13 @@
     return static_cast<int>(parsedNumber);
 }
 
-HashMap<String, String> WindowFeatures::parseDialogFeatures(const String& string)
+static DialogFeaturesMap parseDialogFeaturesMap(const String& string)
 {
-    HashMap<String, String> features;
+    // FIXME: Not clear why we take such a different approach to parsing dialog features
+    // as opposed to window features (using a map, different parsing quirks).
 
+    DialogFeaturesMap features;
+
     Vector<String> vector;
     string.split(';', vector);
 
@@ -239,12 +233,12 @@
         if (separatorPosition == notFound)
             separatorPosition = colonPosition;
 
-        String key = featureString.left(separatorPosition).stripWhiteSpace().lower();
+        String key = featureString.left(separatorPosition).stripWhiteSpace();
 
         // Null string for value indicates key without value.
         String value;
         if (separatorPosition != notFound) {
-            value = featureString.substring(separatorPosition + 1).stripWhiteSpace().lower();
+            value = featureString.substring(separatorPosition + 1).stripWhiteSpace();
             value = value.left(value.find(' '));
         }
 

Modified: trunk/Source/WebCore/page/WindowFeatures.h (196079 => 196080)


--- trunk/Source/WebCore/page/WindowFeatures.h	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/page/WindowFeatures.h	2016-02-03 22:08:57 UTC (rev 196080)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2003, 2007, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2003, 2007, 2010, 2016 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -29,55 +29,39 @@
 #ifndef WindowFeatures_h
 #define WindowFeatures_h
 
-#include <wtf/Forward.h>
-#include <wtf/HashMap.h>
+#include <functional>
 #include <wtf/Optional.h>
 #include <wtf/Vector.h>
-#include <wtf/text/StringHash.h>
+#include <wtf/text/WTFString.h>
 
 namespace WebCore {
 
 class FloatRect;
 
 struct WindowFeatures {
-    WindowFeatures()
-        : menuBarVisible(true)
-        , statusBarVisible(true)
-        , toolBarVisible(true)
-        , locationBarVisible(true)
-        , scrollbarsVisible(true)
-        , resizable(true)
-        , fullscreen(false)
-        , dialog(false)
-    {
-    }
-    explicit WindowFeatures(const String& windowFeaturesString);
-    WindowFeatures(const String& dialogFeaturesString, const FloatRect& screenAvailableRect);
-
     Optional<float> x;
     Optional<float> y;
     Optional<float> width;
     Optional<float> height;
 
-    bool menuBarVisible;
-    bool statusBarVisible;
-    bool toolBarVisible;
-    bool locationBarVisible;
-    bool scrollbarsVisible;
-    bool resizable;
+    bool menuBarVisible { true };
+    bool statusBarVisible { true };
+    bool toolBarVisible { true };
+    bool locationBarVisible { true };
+    bool scrollbarsVisible { true };
+    bool resizable { true };
 
-    bool fullscreen;
-    bool dialog;
+    bool fullscreen { false };
+    bool dialog { false };
 
     Vector<String> additionalFeatures;
-
-private:
-    static HashMap<String, String> parseDialogFeatures(const String&);
-    static bool boolFeature(const HashMap<String, String>&, const char* key, bool defaultValue = false);
-    static float floatFeature(const HashMap<String, String>&, const char* key, float min, float max, float defaultValue);
-    void setWindowFeature(const String& keyString, const String& valueString);
 };
 
+WindowFeatures parseWindowFeatures(StringView windowFeaturesString);
+WindowFeatures parseDialogFeatures(const String& dialogFeaturesString, const FloatRect& screenAvailableRect);
+
+void processFeaturesString(StringView features, std::function<void(StringView type, StringView value)> callback);
+
 } // namespace WebCore
 
 #endif // WindowFeatures_h

Modified: trunk/Source/WebCore/platform/SchemeRegistry.cpp (196079 => 196080)


--- trunk/Source/WebCore/platform/SchemeRegistry.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/platform/SchemeRegistry.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -126,10 +126,10 @@
 
 void SchemeRegistry::removeURLSchemeRegisteredAsLocal(const String& scheme)
 {
-    if (scheme == "file")
+    if (equalLettersIgnoringASCIICase(scheme, "file"))
         return;
 #if PLATFORM(COCOA)
-    if (scheme == "applewebdata")
+    if (equalLettersIgnoringASCIICase(scheme, "applewebdata"))
         return;
 #endif
     localURLSchemes().remove(scheme);

Modified: trunk/Source/WebCore/platform/efl/MIMETypeRegistryEfl.cpp (196079 => 196080)


--- trunk/Source/WebCore/platform/efl/MIMETypeRegistryEfl.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/platform/efl/MIMETypeRegistryEfl.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -31,10 +31,6 @@
 #include "config.h"
 #include "MIMETypeRegistry.h"
 
-#include "NotImplemented.h"
-#include <wtf/Assertions.h>
-#include <wtf/MainThread.h>
-
 namespace WebCore {
 
 struct ExtensionMap {
@@ -74,21 +70,14 @@
     { "xhtml", "application/xhtml+xml" },
     { "wml", "text/vnd.wap.wml" },
     { "wmlc", "application/vnd.wap.wmlc" },
-    { 0, 0 }
 };
 
-String MIMETypeRegistry::getMIMETypeForExtension(const String &ext)
+String MIMETypeRegistry::getMIMETypeForExtension(const String& extension)
 {
-    ASSERT(isMainThread());
-
-    String s = ext.lower();
-    const ExtensionMap *e = extensionMap;
-    while (e->extension) {
-        if (s == e->extension)
-            return e->mimeType;
-        ++e;
+    for (auto& entry : extensionMap) {
+        if (equalIgnoringASCIICase(extension, entry.extension))
+            return entry.mimeType;
     }
-
     return String();
 }
 

Modified: trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp (196079 => 196080)


--- trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -324,10 +324,10 @@
 {
     ASSERT(!m_reloadTimer.isActive());
 
-    m_contentMIMEType = contentType.type().lower();
+    m_contentMIMEType = contentType.type().convertToASCIILowercase();
     m_contentTypeCodecs = contentType.parameter(codecs());
     m_url = url;
-    m_keySystem = keySystem.lower();
+    m_keySystem = keySystem.convertToASCIILowercase();
     m_contentMIMETypeWasInferredFromExtension = false;
 
 #if ENABLE(MEDIA_SOURCE)
@@ -366,7 +366,7 @@
     ASSERT(mediaSource);
 
     m_mediaSource = mediaSource;
-    m_contentMIMEType = contentType.type().lower();
+    m_contentMIMEType = contentType.type().convertToASCIILowercase();
     m_contentTypeCodecs = contentType.parameter(codecs());
     m_url = url;
     m_keySystem = "";
@@ -517,17 +517,17 @@
 #if ENABLE(ENCRYPTED_MEDIA)
 MediaPlayer::MediaKeyException MediaPlayer::generateKeyRequest(const String& keySystem, const unsigned char* initData, unsigned initDataLength)
 {
-    return m_private->generateKeyRequest(keySystem.lower(), initData, initDataLength);
+    return m_private->generateKeyRequest(keySystem.convertToASCIILowercase(), initData, initDataLength);
 }
 
 MediaPlayer::MediaKeyException MediaPlayer::addKey(const String& keySystem, const unsigned char* key, unsigned keyLength, const unsigned char* initData, unsigned initDataLength, const String& sessionId)
 {
-    return m_private->addKey(keySystem.lower(), key, keyLength, initData, initDataLength, sessionId);
+    return m_private->addKey(keySystem.convertToASCIILowercase(), key, keyLength, initData, initDataLength, sessionId);
 }
 
 MediaPlayer::MediaKeyException MediaPlayer::cancelKeyRequest(const String& keySystem, const String& sessionId)
 {
-    return m_private->cancelKeyRequest(keySystem.lower(), sessionId);
+    return m_private->cancelKeyRequest(keySystem.convertToASCIILowercase(), sessionId);
 }
 #endif
 

Modified: trunk/Source/WebCore/platform/graphics/opengl/Extensions3DOpenGLCommon.cpp (196079 => 196080)


--- trunk/Source/WebCore/platform/graphics/opengl/Extensions3DOpenGLCommon.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/platform/graphics/opengl/Extensions3DOpenGLCommon.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -65,7 +65,7 @@
     m_renderer = String(reinterpret_cast<const char*>(::glGetString(GL_RENDERER)));
 
     Vector<String> vendorComponents;
-    m_vendor.lower().split(' ', vendorComponents);
+    m_vendor.convertToASCIILowercase().split(' ', vendorComponents);
     if (vendorComponents.contains("nvidia"))
         m_isNVIDIA = true;
     if (vendorComponents.contains("ati") || vendorComponents.contains("amd"))

Modified: trunk/Source/WebCore/platform/gtk/MIMETypeRegistryGtk.cpp (196079 => 196080)


--- trunk/Source/WebCore/platform/gtk/MIMETypeRegistryGtk.cpp	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/platform/gtk/MIMETypeRegistryGtk.cpp	2016-02-03 22:08:57 UTC (rev 196080)
@@ -28,9 +28,6 @@
 #include "config.h"
 #include "MIMETypeRegistry.h"
 
-#include <wtf/Assertions.h>
-#include <wtf/MainThread.h>
-
 namespace WebCore {
 
 struct ExtensionMap {
@@ -61,21 +58,14 @@
     { "xhtml", "application/xhtml+xml" },
     { "wml", "text/vnd.wap.wml" },
     { "wmlc", "application/vnd.wap.wmlc" },
-    { 0, 0 }
 };
 
-String MIMETypeRegistry::getMIMETypeForExtension(const String &ext)
+String MIMETypeRegistry::getMIMETypeForExtension(const String& extension)
 {
-    ASSERT(isMainThread());
-
-    String s = ext.lower();
-    const ExtensionMap *e = extensionMap;
-    while (e->extension) {
-        if (s == e->extension)
-            return e->mimeType;
-        ++e;
+    for (auto& entry : extensionMap) {
+        if (equalIgnoringASCIICase(extension, entry.extension))
+            return entry.mimeType;
     }
-
     return String();
 }
 

Modified: trunk/Source/WebCore/platform/mac/PasteboardMac.mm (196079 => 196080)


--- trunk/Source/WebCore/platform/mac/PasteboardMac.mm	2016-02-03 21:54:36 UTC (rev 196079)
+++ trunk/Source/WebCore/platform/mac/PasteboardMac.mm	2016-02-03 22:08:57 UTC (rev 196080)
@@ -417,34 +417,32 @@
 static String cocoaTypeFromHTMLClipboardType(const String& type)
 {
     // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dom-datatransfer-setdata
-    String qType = type.lower();
+    String lowercasedType = type.convertToASCIILowercase();
 
-    if (qType == "text")
-        qType = ASCIILiteral("text/plain");
-    if (qType == "url")
-        qType = ASCIILiteral("text/uri-list");
+    if (lowercasedType == "text")
+        lowercasedType = ASCIILiteral("text/plain");
+    if (lowercasedType == "url")
+        lowercasedType = ASCIILiteral("text/uri-list");
 
-    // Ignore any trailing charset - JS strings are Unicode, which encapsulates the charset issue
-    if (qType == "text/plain" || qType.startsWith("text/plain;"))
-        return String(NSStringPboardType);
-    if (qType == "text/uri-list")
-        // special case because UTI doesn't work with Cocoa's URL type
-        return String(NSURLPboardType); // note special case in getData to read NSFilenamesType
+    // Ignore any trailing charset - strings are already UTF-16, and the charset issue has already been dealt with.
+    if (lowercasedType == "text/plain" || lowercasedType.startsWith("text/plain;"))
+        return NSStringPboardType;
+    if (lowercasedType == "text/uri-list") {
+        // Special case because UTI doesn't work with Cocoa's URL type.
+        return NSURLPboardType;
+    }
 
-    // Blacklist types that might contain subframe information
-    if (qType == "text/rtf" || qType == "public.rtf" || qType == "com.apple.traditional-mac-plain-text")
+    // Blacklist types that might contain subframe information.
+    if (lowercasedType == "text/rtf" || lowercasedType == "public.rtf" || lowercasedType == "com.apple.traditional-mac-plain-text")
         return String();
 
-    // Try UTI now
-    String mimeType = qType;
-    if (RetainPtr<CFStringRef> utiType = adoptCF(UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType.createCFString().get(), NULL))) {
-        RetainPtr<CFStringRef> pbType = adoptCF(UTTypeCopyPreferredTagWithClass(utiType.get(), kUTTagClassNSPboardType));
-        if (pbType)
+    if (auto utiType = adoptCF(UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, lowercasedType.createCFString().get(), NULL))) {
+        if (auto pbType = adoptCF(UTTypeCopyPreferredTagWithClass(utiType.get(), kUTTagClassNSPboardType)))
             return pbType.get();
     }
 
     // No mapping, just pass the whole string though
-    return qType;
+    return lowercasedType;
 }
 
 void Pasteboard::clear(const String& type)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to