Add TextStream dumping for ThemeTypes enums
https://bugs.webkit.org/show_bug.cgi?id=202972

Reviewed by Dean Jackson.

Make ControlPart, SelectionPart, ThemeFont and ThemeColor dumpable.

* Sources.txt:
* WebCore.xcodeproj/project.pbxproj:
* platform/ThemeTypes.cpp: Added.
(WebCore::operator<<):
* platform/ThemeTypes.h:


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@251159 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 4c61cae..26f554a 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,5 +1,20 @@
 2019-10-15  Simon Fraser  <simon.fraser@apple.com>
 
+        Add TextStream dumping for ThemeTypes enums
+        https://bugs.webkit.org/show_bug.cgi?id=202972
+
+        Reviewed by Dean Jackson.
+
+        Make ControlPart, SelectionPart, ThemeFont and ThemeColor dumpable.
+
+        * Sources.txt:
+        * WebCore.xcodeproj/project.pbxproj:
+        * platform/ThemeTypes.cpp: Added.
+        (WebCore::operator<<):
+        * platform/ThemeTypes.h:
+
+2019-10-15  Simon Fraser  <simon.fraser@apple.com>
+
         Add dumping for Animation and AnimationList
         https://bugs.webkit.org/show_bug.cgi?id=202973
 
diff --git a/Source/WebCore/Sources.txt b/Source/WebCore/Sources.txt
index 0da6279..329af4b 100644
--- a/Source/WebCore/Sources.txt
+++ b/Source/WebCore/Sources.txt
@@ -1753,6 +1753,7 @@
 platform/Theme.cpp
 platform/ThreadGlobalData.cpp
 platform/ThreadTimers.cpp
+platform/ThemeTypes.cpp
 platform/Timer.cpp
 platform/UserActivity.cpp
 platform/WebCoreCrossThreadCopier.cpp
diff --git a/Source/WebCore/WebCore.xcodeproj/project.pbxproj b/Source/WebCore/WebCore.xcodeproj/project.pbxproj
index ca2a4ea..a07ac6f 100644
--- a/Source/WebCore/WebCore.xcodeproj/project.pbxproj
+++ b/Source/WebCore/WebCore.xcodeproj/project.pbxproj
@@ -5626,6 +5626,7 @@
 		0F26A7AB2054FCE10090A141 /* MathMLUnknownElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MathMLUnknownElement.cpp; sourceTree = "<group>"; };
 		0F26A7AC2055C8D70090A141 /* XMLDocument.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XMLDocument.cpp; sourceTree = "<group>"; };
 		0F26A7AD205626100090A141 /* SVGUnknownElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGUnknownElement.cpp; sourceTree = "<group>"; };
+		0F283A8D235582F8004794CA /* ThemeTypes.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ThemeTypes.cpp; sourceTree = "<group>"; };
 		0F36E7361BD1837A002DB891 /* LayoutPoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LayoutPoint.cpp; sourceTree = "<group>"; };
 		0F36E7381BD184B9002DB891 /* LayoutSize.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LayoutSize.cpp; sourceTree = "<group>"; };
 		0F37F0832202AC8F00A89C0B /* ScrollingTreeScrollingNodeDelegateMac.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ScrollingTreeScrollingNodeDelegateMac.mm; sourceTree = "<group>"; };
@@ -25675,6 +25676,7 @@
 				7CC564B618BABEA6001B9652 /* TelephoneNumberDetector.h */,
 				BCE65D310EAD1211007E4533 /* Theme.cpp */,
 				BCE658FE0EA9248A007E4533 /* Theme.h */,
+				0F283A8D235582F8004794CA /* ThemeTypes.cpp */,
 				BCE659A80EA927B9007E4533 /* ThemeTypes.h */,
 				51DF6D7D0B92A16D00C2DC85 /* ThreadCheck.h */,
 				E1FF57A50F01256B00891EBB /* ThreadGlobalData.cpp */,
diff --git a/Source/WebCore/platform/ThemeTypes.cpp b/Source/WebCore/platform/ThemeTypes.cpp
new file mode 100644
index 0000000..5eb0e14
--- /dev/null
+++ b/Source/WebCore/platform/ThemeTypes.cpp
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2019 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "ThemeTypes.h"
+
+#include <wtf/text/TextStream.h>
+
+namespace WebCore {
+
+TextStream& operator<<(TextStream& ts, ControlPart controlPart)
+{
+    switch (controlPart) {
+    case NoControlPart: ts << "no-control-part"; break;
+    case CheckboxPart: ts << "checkbox-part"; break;
+    case RadioPart: ts << "radio-part"; break;
+    case PushButtonPart: ts << "push-button-part"; break;
+    case SquareButtonPart: ts << "square-button-part"; break;
+    case ButtonPart: ts << "button-part"; break;
+    case ButtonBevelPart: ts << "button-bevel-part"; break;
+    case DefaultButtonPart: ts << "default-button-part"; break;
+    case InnerSpinButtonPart: ts << "inner-spin-button-part"; break;
+    case ListboxPart: ts << "listbox-part"; break;
+    case ListItemPart: ts << "list-item-part"; break;
+    case MediaControlsBackgroundPart: ts << "media-controls-background-part"; break;
+    case MediaControlsDarkBarBackgroundPart: ts << "media-controls-dark-bar-background-part"; break;
+    case MediaControlsFullscreenBackgroundPart: ts << "media-controls-fullscreen-background-part"; break;
+    case MediaControlsLightBarBackgroundPart: ts << "media-controls-light-bar-background-part"; break;
+    case MediaCurrentTimePart: ts << "media-current-time-part"; break;
+    case MediaEnterFullscreenButtonPart: ts << "media-enter-fullscreen-button-part"; break;
+    case MediaExitFullscreenButtonPart: ts << "media-exit-fullscreen-button-part"; break;
+    case MediaFullScreenVolumeSliderPart: ts << "media-full-screen-volume-slider-part"; break;
+    case MediaFullScreenVolumeSliderThumbPart: ts << "media-full-screen-volume-slider-thumb-part"; break;
+    case MediaMuteButtonPart: ts << "media-mute-button-part"; break;
+    case MediaOverlayPlayButtonPart: ts << "media-overlay-play-button-part"; break;
+    case MediaPlayButtonPart: ts << "media-play-button-part"; break;
+    case MediaReturnToRealtimeButtonPart: ts << "media-return-to-realtime-button-part"; break;
+    case MediaRewindButtonPart: ts << "media-rewind-button-part"; break;
+    case MediaSeekBackButtonPart: ts << "media-seek-back-button-part"; break;
+    case MediaSeekForwardButtonPart: ts << "media-seek-forward-button-part"; break;
+    case MediaSliderPart: ts << "media-slider-part"; break;
+    case MediaSliderThumbPart: ts << "media-slider-thumb-part"; break;
+    case MediaTimeRemainingPart: ts << "media-time-remaining-part"; break;
+    case MediaToggleClosedCaptionsButtonPart: ts << "media-toggle-closed-captions-button-part"; break;
+    case MediaVolumeSliderPart: ts << "media-volume-slider-part"; break;
+    case MediaVolumeSliderContainerPart: ts << "media-volume-slider-container-part"; break;
+    case MediaVolumeSliderMuteButtonPart: ts << "media-volume-slider-mute-button-part"; break;
+    case MediaVolumeSliderThumbPart: ts << "media-volume-slider-thumb-part"; break;
+    case MenulistPart: ts << "menulist-part"; break;
+    case MenulistButtonPart: ts << "menulist-button-part"; break;
+    case MenulistTextPart: ts << "menulist-text-part"; break;
+    case MenulistTextFieldPart: ts << "menulist-text-field-part"; break;
+    case MeterPart: ts << "meter-part"; break;
+    case ProgressBarPart: ts << "progress-bar-part"; break;
+    case ProgressBarValuePart: ts << "progress-bar-value-part"; break;
+    case SliderHorizontalPart: ts << "slider-horizontal-part"; break;
+    case SliderVerticalPart: ts << "slider-vertical-part"; break;
+    case SliderThumbHorizontalPart: ts << "slider-thumb-horizontal-part"; break;
+    case SliderThumbVerticalPart: ts << "slider-thumb-vertical-part"; break;
+    case CaretPart: ts << "caret-part"; break;
+    case SearchFieldPart: ts << "search-field-part"; break;
+    case SearchFieldDecorationPart: ts << "search-field-decoration-part"; break;
+    case SearchFieldResultsDecorationPart: ts << "search-field-results-decoration-part"; break;
+    case SearchFieldResultsButtonPart: ts << "search-field-results-button-part"; break;
+    case SearchFieldCancelButtonPart: ts << "search-field-cancel-button-part"; break;
+    case SnapshottedPluginOverlayPart: ts << "snapshotted-plugin-overlay-part"; break;
+    case TextFieldPart: ts << "text-field-part"; break;
+    case RelevancyLevelIndicatorPart: ts << "relevancy-level-indicator-part"; break;
+    case ContinuousCapacityLevelIndicatorPart: ts << "continuous-capacity-level-indicator-part"; break;
+    case DiscreteCapacityLevelIndicatorPart: ts << "discrete-capacity-level-indicator-part"; break;
+    case RatingLevelIndicatorPart: ts << "rating-level-indicator-part"; break;
+#if ENABLE(SERVICE_CONTROLS)
+    case ImageControlsButtonPart: ts << "image-controls-button-part"; break;
+#endif
+#if ENABLE(APPLE_PAY)
+    case ApplePayButtonPart: ts << "apple-pay-button-part"; break;
+#endif
+#if ENABLE(INPUT_TYPE_COLOR)
+    case ColorWellPart: ts << "color-well-part"; break;
+#endif
+#if ENABLE(DATALIST_ELEMENT)
+    case ListButtonPart: ts << "list-button-part"; break;
+#endif
+    case TextAreaPart: ts << "text-area-part"; break;
+#if ENABLE(ATTACHMENT_ELEMENT)
+    case AttachmentPart: ts << "attachment-part"; break;
+    case BorderlessAttachmentPart: ts << "borderless-attachment-part"; break;
+#endif
+    case CapsLockIndicatorPart: ts << "caps-lock-indicator-part"; break;
+    }
+    
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, SelectionPart selectionPart)
+{
+    switch (selectionPart) {
+    case SelectionBackground: ts << "selection-background"; break;
+    case SelectionForeground: ts << "selection-foreground"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, ThemeFont themeFont)
+{
+    switch (themeFont) {
+    case CaptionFont: ts << "caption-font"; break;
+    case IconFont: ts << "icon-font"; break;
+    case MenuFont: ts << "menu-font"; break;
+    case MessageBoxFont: ts << "messagebox-font"; break;
+    case SmallCaptionFont: ts << "small-caption-font"; break;
+    case StatusBarFont: ts << "statusbar-font"; break;
+    case MiniControlFont: ts << "minicontrol-font"; break;
+    case SmallControlFont: ts << "small-control-font"; break;
+    case ControlFont: ts << "control-font"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, ThemeColor themeColor)
+{
+    switch (themeColor) {
+    case ActiveBorderColor: ts << "active-border-color"; break;
+    case ActiveCaptionColor: ts << "active-caption-color"; break;
+    case AppWorkspaceColor: ts << "app-workspace-color"; break;
+    case BackgroundColor: ts << "background-color"; break;
+    case ButtonFaceColor: ts << "button-face-color"; break;
+    case ButtonHighlightColor: ts << "button-highlight-color"; break;
+    case ButtonShadowColor: ts << "button-shadow-color"; break;
+    case ButtonTextColor: ts << "button-text-color"; break;
+    case CaptionTextColor: ts << "caption-text-color"; break;
+    case GrayTextColor: ts << "gray-text-color"; break;
+    case HighlightColor: ts << "highlight-color"; break;
+    case HighlightTextColor: ts << "highlight-text-color"; break;
+    case InactiveBorderColor: ts << "inactive-border-color"; break;
+    case InactiveCaptionColor: ts << "inactive-caption-color"; break;
+    case InactiveCaptionTextColor: ts << "inactive-caption-text-color"; break;
+    case InfoBackgroundColor: ts << "info-background-color"; break;
+    case InfoTextColor: ts << "info-text-color"; break;
+    case MatchColor: ts << "match-color"; break;
+    case MenuTextColor: ts << "menu-text-color"; break;
+    case ScrollbarColor: ts << "scrollbar-color"; break;
+    case ThreeDDarkShadowColor: ts << "threeD-dark-shadow-color"; break;
+    case ThreeDFaceColor: ts << "threeD-face-color"; break;
+    case ThreeDHighlightColor: ts << "threeD-highlight-color"; break;
+    case ThreeDLightShadowColor: ts << "threeD-light-shadow-color"; break;
+    case ThreeDShadowColor: ts << "threeD-shadow-color"; break;
+    case WindowColor: ts << "window-color"; break;
+    case WindowFrameColor: ts << "window-frame-color"; break;
+    case WindowTextColor: ts << "window-text-color"; break;
+    case FocusRingColor: ts << "focus-ring-color"; break;
+    }
+    return ts;
+}
+
+} // namespace WebCore
diff --git a/Source/WebCore/platform/ThemeTypes.h b/Source/WebCore/platform/ThemeTypes.h
index 061f393..1efb4ba 100644
--- a/Source/WebCore/platform/ThemeTypes.h
+++ b/Source/WebCore/platform/ThemeTypes.h
@@ -25,6 +25,10 @@
 
 #pragma once
 
+namespace WTF {
+class TextStream;
+}
+
 namespace WebCore {
 
 // Must follow CSSValueKeywords.in order
@@ -156,4 +160,9 @@
     FocusRingColor
 };
 
-}
+WTF::TextStream& operator<<(WTF::TextStream&, ControlPart);
+WTF::TextStream& operator<<(WTF::TextStream&, SelectionPart);
+WTF::TextStream& operator<<(WTF::TextStream&, ThemeFont);
+WTF::TextStream& operator<<(WTF::TextStream&, ThemeColor);
+
+} // namespace WebCore