1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "third_party/blink/renderer/platform/image-encoders/image_encoder_utils.h"
6 
7 #include "third_party/blink/renderer/platform/instrumentation/histogram.h"
8 #include "third_party/blink/renderer/platform/network/mime/mime_type_registry.h"
9 #include "third_party/blink/renderer/platform/wtf/threading.h"
10 
11 namespace blink {
12 
13 const ImageEncodingMimeType ImageEncoderUtils::kDefaultEncodingMimeType =
14     kMimeTypePng;
15 const char ImageEncoderUtils::kDefaultRequestedMimeType[] = "image/png";
16 
17 namespace {
18 // This enum is used in a UMA histogram; the values should not be changed.
19 enum RequestedImageMimeType {
20   kRequestedImageMimeTypePng = 0,
21   kRequestedImageMimeTypeJpeg = 1,
22   kRequestedImageMimeTypeWebp = 2,
23   kRequestedImageMimeTypeGif = 3,
24   kRequestedImageMimeTypeBmp = 4,
25   kRequestedImageMimeTypeIco = 5,
26   kRequestedImageMimeTypeTiff = 6,
27   kRequestedImageMimeTypeUnknown = 7,
28   kMaxValue = kRequestedImageMimeTypeUnknown,
29 };
30 
31 }  // namespace
32 
ToEncodingMimeType(const String & mime_type_name,const EncodeReason encode_reason)33 ImageEncodingMimeType ImageEncoderUtils::ToEncodingMimeType(
34     const String& mime_type_name,
35     const EncodeReason encode_reason) {
36   String lowercase_mime_type = mime_type_name.LowerASCII();
37 
38   RequestedImageMimeType requested_mime_type;
39   if (mime_type_name.IsNull())
40     lowercase_mime_type = kDefaultRequestedMimeType;
41 
42   if (lowercase_mime_type == "image/png") {
43     requested_mime_type = kRequestedImageMimeTypePng;
44   } else if (lowercase_mime_type == "image/jpeg") {
45     requested_mime_type = kRequestedImageMimeTypeJpeg;
46   } else if (lowercase_mime_type == "image/webp") {
47     requested_mime_type = kRequestedImageMimeTypeWebp;
48   } else if (lowercase_mime_type == "image/gif") {
49     requested_mime_type = kRequestedImageMimeTypeGif;
50   } else if (lowercase_mime_type == "image/bmp" ||
51              lowercase_mime_type == "image/x-windows-bmp") {
52     requested_mime_type = kRequestedImageMimeTypeBmp;
53   } else if (lowercase_mime_type == "image/x-icon") {
54     requested_mime_type = kRequestedImageMimeTypeIco;
55   } else if (lowercase_mime_type == "image/tiff" ||
56              lowercase_mime_type == "image/x-tiff") {
57     requested_mime_type = kRequestedImageMimeTypeTiff;
58   } else {
59     requested_mime_type = kRequestedImageMimeTypeUnknown;
60   }
61 
62   if (encode_reason == kEncodeReasonToDataURL) {
63     UMA_HISTOGRAM_ENUMERATION("Blink.Canvas.RequestedImageMimeTypes_toDataURL",
64                               requested_mime_type);
65   } else if (encode_reason == kEncodeReasonToBlobCallback) {
66     UMA_HISTOGRAM_ENUMERATION(
67         "Blink.Canvas.RequestedImageMimeTypes_toBlobCallback",
68         requested_mime_type);
69   } else if (encode_reason == kEncodeReasonConvertToBlobPromise) {
70     UMA_HISTOGRAM_ENUMERATION(
71         "Blink.Canvas.RequestedImageMimeTypes_convertToBlobPromise",
72         requested_mime_type);
73   }
74 
75   ImageEncodingMimeType encoding_mime_type = kDefaultEncodingMimeType;
76   // FIXME: Make isSupportedImageMIMETypeForEncoding threadsafe (to allow this
77   // method to be used on a worker thread).
78   if (MIMETypeRegistry::IsSupportedImageMIMETypeForEncoding(
79           lowercase_mime_type))
80     ParseImageEncodingMimeType(lowercase_mime_type, encoding_mime_type);
81   return encoding_mime_type;
82 }
83 
84 }  // namespace blink
85