|  | // Copyright 2016 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "platform/image-encoders/ImageEncoderUtils.h" | 
|  |  | 
|  | #include "platform/Histogram.h" | 
|  | #include "platform/network/mime/MIMETypeRegistry.h" | 
|  | #include "platform/wtf/Threading.h" | 
|  |  | 
|  | namespace blink { | 
|  |  | 
|  | const char ImageEncoderUtils::kDefaultMimeType[] = "image/png"; | 
|  |  | 
|  | // This enum is used in a UMA histogram; the values should not be changed. | 
|  | enum RequestedImageMimeType { | 
|  | kRequestedImageMimeTypePng = 0, | 
|  | kRequestedImageMimeTypeJpeg = 1, | 
|  | kRequestedImageMimeTypeWebp = 2, | 
|  | kRequestedImageMimeTypeGif = 3, | 
|  | kRequestedImageMimeTypeBmp = 4, | 
|  | kRequestedImageMimeTypeIco = 5, | 
|  | kRequestedImageMimeTypeTiff = 6, | 
|  | kRequestedImageMimeTypeUnknown = 7, | 
|  | kNumberOfRequestedImageMimeTypes | 
|  | }; | 
|  |  | 
|  | String ImageEncoderUtils::ToEncodingMimeType(const String& mime_type, | 
|  | const EncodeReason encode_reason) { | 
|  | String lowercase_mime_type = mime_type.DeprecatedLower(); | 
|  |  | 
|  | if (mime_type.IsNull()) | 
|  | lowercase_mime_type = kDefaultMimeType; | 
|  |  | 
|  | RequestedImageMimeType image_format; | 
|  | if (lowercase_mime_type == "image/png") { | 
|  | image_format = kRequestedImageMimeTypePng; | 
|  | } else if (lowercase_mime_type == "image/jpeg") { | 
|  | image_format = kRequestedImageMimeTypeJpeg; | 
|  | } else if (lowercase_mime_type == "image/webp") { | 
|  | image_format = kRequestedImageMimeTypeWebp; | 
|  | } else if (lowercase_mime_type == "image/gif") { | 
|  | image_format = kRequestedImageMimeTypeGif; | 
|  | } else if (lowercase_mime_type == "image/bmp" || | 
|  | lowercase_mime_type == "image/x-windows-bmp") { | 
|  | image_format = kRequestedImageMimeTypeBmp; | 
|  | } else if (lowercase_mime_type == "image/x-icon") { | 
|  | image_format = kRequestedImageMimeTypeIco; | 
|  | } else if (lowercase_mime_type == "image/tiff" || | 
|  | lowercase_mime_type == "image/x-tiff") { | 
|  | image_format = kRequestedImageMimeTypeTiff; | 
|  | } else { | 
|  | image_format = kRequestedImageMimeTypeUnknown; | 
|  | } | 
|  |  | 
|  | if (encode_reason == kEncodeReasonToDataURL) { | 
|  | DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, | 
|  | to_data_url_image_format_histogram, | 
|  | ("Canvas.RequestedImageMimeTypes_toDataURL", | 
|  | kNumberOfRequestedImageMimeTypes)); | 
|  | to_data_url_image_format_histogram.Count(image_format); | 
|  | } else if (encode_reason == kEncodeReasonToBlobCallback) { | 
|  | DEFINE_THREAD_SAFE_STATIC_LOCAL( | 
|  | EnumerationHistogram, to_blob_callback_image_format_histogram, | 
|  | ("Canvas.RequestedImageMimeTypes_toBlobCallback", | 
|  | kNumberOfRequestedImageMimeTypes)); | 
|  | to_blob_callback_image_format_histogram.Count(image_format); | 
|  | } else if (encode_reason == kEncodeReasonConvertToBlobPromise) { | 
|  | DEFINE_THREAD_SAFE_STATIC_LOCAL( | 
|  | EnumerationHistogram, convert_to_blob_promise_image_format_histogram, | 
|  | ("Canvas.RequestedImageMimeTypes_convertToBlobPromise", | 
|  | kNumberOfRequestedImageMimeTypes)); | 
|  | convert_to_blob_promise_image_format_histogram.Count(image_format); | 
|  | } | 
|  |  | 
|  | // FIXME: Make isSupportedImageMIMETypeForEncoding threadsafe (to allow this | 
|  | // method to be used on a worker thread). | 
|  | if (!MIMETypeRegistry::IsSupportedImageMIMETypeForEncoding( | 
|  | lowercase_mime_type)) | 
|  | lowercase_mime_type = kDefaultMimeType; | 
|  | return lowercase_mime_type; | 
|  | } | 
|  |  | 
|  | }  // namespace blink |