Implement TextStream-based dumping for all the RenderStyle and SVGRenderStyle enum classes
https://bugs.webkit.org/show_bug.cgi?id=202877

Reviewed by Dean Jackson.

Make style-related enum classes dumpable with TextStream,  and make some SVG style-related
classes dumpable.

* rendering/style/RenderStyleConstants.cpp:
(WebCore::operator<<):
* rendering/style/RenderStyleConstants.h:
* rendering/style/SVGRenderStyleDefs.cpp:
(WebCore::operator<<):
* rendering/style/SVGRenderStyleDefs.h:
* rendering/style/ShadowData.cpp:
(WebCore::operator<<):
* rendering/style/ShadowData.h:


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@251052 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 890c0aa..3f5b316 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,23 @@
+2019-10-12  Simon Fraser  <simon.fraser@apple.com>
+
+        Implement TextStream-based dumping for all the RenderStyle and SVGRenderStyle enum classes
+        https://bugs.webkit.org/show_bug.cgi?id=202877
+
+        Reviewed by Dean Jackson.
+
+        Make style-related enum classes dumpable with TextStream,  and make some SVG style-related
+        classes dumpable.
+
+        * rendering/style/RenderStyleConstants.cpp:
+        (WebCore::operator<<):
+        * rendering/style/RenderStyleConstants.h:
+        * rendering/style/SVGRenderStyleDefs.cpp:
+        (WebCore::operator<<):
+        * rendering/style/SVGRenderStyleDefs.h:
+        * rendering/style/ShadowData.cpp:
+        (WebCore::operator<<):
+        * rendering/style/ShadowData.h:
+
 2019-10-12  Chris Dumez  <cdumez@apple.com>
 
         Unreviewed, rolling out r251040.
diff --git a/Source/WebCore/rendering/style/RenderStyleConstants.cpp b/Source/WebCore/rendering/style/RenderStyleConstants.cpp
index 11c56ad..9d4b5a1 100644
--- a/Source/WebCore/rendering/style/RenderStyleConstants.cpp
+++ b/Source/WebCore/rendering/style/RenderStyleConstants.cpp
@@ -26,43 +26,451 @@
 #include "config.h"
 #include "RenderStyleConstants.h"
 
+#include "TabSize.h"
 #include <wtf/text/TextStream.h>
 
 namespace WebCore {
 
-TextStream& operator<<(TextStream& ts, Visibility visibility)
+TextStream& operator<<(TextStream& ts, AnimationFillMode fillMode)
+{
+    switch (fillMode) {
+    case AnimationFillMode::None: ts << "none"; break;
+    case AnimationFillMode::Forwards: ts << "forwards"; break;
+    case AnimationFillMode::Backwards: ts << "backwards"; break;
+    case AnimationFillMode::Both: ts << "both"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, AnimationPlayState playState)
+{
+    switch (playState) {
+    case AnimationPlayState::Playing: ts << "playing"; break;
+    case AnimationPlayState::Paused: ts << "paused"; break;
+    }
+    return ts;
+}
+
+#if ENABLE(APPLE_PAY)
+TextStream& operator<<(TextStream& ts, ApplePayButtonStyle buttonStyle)
+{
+    switch (buttonStyle) {
+    case ApplePayButtonStyle::White: ts << "white"; break;
+    case ApplePayButtonStyle::WhiteOutline: ts << "white-outline"; break;
+    case ApplePayButtonStyle::Black: ts << "black"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, ApplePayButtonType playState)
+{
+    switch (playState) {
+    case ApplePayButtonType::Plain: ts << "plain"; break;
+    case ApplePayButtonType::Buy: ts << "buy"; break;
+    case ApplePayButtonType::SetUp: ts << "setup"; break;
+    case ApplePayButtonType::Donate: ts << "donate"; break;
+#if ENABLE(APPLE_PAY_SESSION_V4)
+    case ApplePayButtonType::CheckOut: ts << "checkout"; break;
+    case ApplePayButtonType::Book: ts << "book"; break;
+    case ApplePayButtonType::Subscribe: ts << "subscribe"; break;
+#endif
+
+    }
+    return ts;
+}
+#endif
+
+TextStream& operator<<(TextStream& ts, AspectRatioType aspectRatioType)
+{
+    switch (aspectRatioType) {
+    case AspectRatioType::Auto: ts << "auto"; break;
+    case AspectRatioType::FromIntrinsic: ts << "from-intrinsic"; break;
+    case AspectRatioType::FromDimensions: ts << "from-dimensions"; break;
+    case AspectRatioType::Specified: ts << "specified"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, AutoRepeatType repeatType)
+{
+    switch (repeatType) {
+    case AutoRepeatType::None: ts << "none"; break;
+    case AutoRepeatType::Fill: ts << "fill"; break;
+    case AutoRepeatType::Fit: ts << "fit"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, BackfaceVisibility visibility)
 {
     switch (visibility) {
-    case Visibility::Visible: ts << "visible"; break;
-    case Visibility::Hidden: ts << "hidden"; break;
-    case Visibility::Collapse: ts << "collapse"; break;
+    case BackfaceVisibility::Visible: ts << "visible"; break;
+    case BackfaceVisibility::Hidden: ts << "hidden"; break;
     }
-    
     return ts;
 }
 
-TextStream& operator<<(TextStream& ts, ImageRendering imageRendering)
+TextStream& operator<<(TextStream& ts, BorderCollapse collapse)
 {
-    switch (imageRendering) {
-    case ImageRendering::Auto: ts << "auto"; break;
-    case ImageRendering::OptimizeSpeed: ts << "optimizeSpeed"; break;
-    case ImageRendering::OptimizeQuality: ts << "optimizeQuality"; break;
-    case ImageRendering::CrispEdges: ts << "crispEdges"; break;
-    case ImageRendering::Pixelated: ts << "pixelated"; break;
+    switch (collapse) {
+    case BorderCollapse::Separate: ts << "separate"; break;
+    case BorderCollapse::Collapse: ts << "collapse"; break;
     }
-    
     return ts;
 }
 
-TextStream& operator<<(TextStream& ts, FillSizeType sizeType)
+TextStream& operator<<(TextStream& ts, BorderFit borderFit)
 {
-    switch (sizeType) {
-    case FillSizeType::Contain: ts << "contain"; break;
-    case FillSizeType::Cover: ts << "cover"; break;
-    case FillSizeType::Size: ts << "size-length"; break;
-    case FillSizeType::None: ts << "size-none"; break;
+    switch (borderFit) {
+    case BorderFit::Border: ts << "border"; break;
+    case BorderFit::Lines: ts << "lines"; break;
     }
-    
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, BorderStyle borderStyle)
+{
+    switch (borderStyle) {
+    case BorderStyle::None: ts << "none"; break;
+    case BorderStyle::Hidden: ts << "hidden"; break;
+    case BorderStyle::Inset: ts << "inset"; break;
+    case BorderStyle::Groove: ts << "groove"; break;
+    case BorderStyle::Outset: ts << "outset"; break;
+    case BorderStyle::Ridge: ts << "ridge"; break;
+    case BorderStyle::Dotted: ts << "dotted"; break;
+    case BorderStyle::Dashed: ts << "dashed"; break;
+    case BorderStyle::Solid: ts << "solid"; break;
+    case BorderStyle::Double: ts << "double"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, BoxAlignment boxAlignment)
+{
+    switch (boxAlignment) {
+    case BoxAlignment::Stretch: ts << "stretch"; break;
+    case BoxAlignment::Start: ts << "start"; break;
+    case BoxAlignment::Center: ts << "center"; break;
+    case BoxAlignment::End: ts << "end"; break;
+    case BoxAlignment::Baseline: ts << "baseline"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, BoxDecorationBreak decorationBreak)
+{
+    switch (decorationBreak) {
+    case BoxDecorationBreak::Slice: ts << "slice"; break;
+    case BoxDecorationBreak::Clone: ts << "clone"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, BoxDirection boxDirection)
+{
+    switch (boxDirection) {
+    case BoxDirection::Normal: ts << "normal"; break;
+    case BoxDirection::Reverse: ts << "reverse"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, BoxLines boxLines)
+{
+    switch (boxLines) {
+    case BoxLines::Single: ts << "single"; break;
+    case BoxLines::Multiple: ts << "multiple"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, BoxOrient boxOrient)
+{
+    switch (boxOrient) {
+    case BoxOrient::Horizontal: ts << "horizontal"; break;
+    case BoxOrient::Vertical: ts << "vertical"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, BoxPack boxPack)
+{
+    switch (boxPack) {
+    case BoxPack::Start: ts << "start"; break;
+    case BoxPack::Center: ts << "center"; break;
+    case BoxPack::End: ts << "end"; break;
+    case BoxPack::Justify: ts << "justify"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, BoxSizing boxSizing)
+{
+    switch (boxSizing) {
+    case BoxSizing::ContentBox: ts << "content-box"; break;
+    case BoxSizing::BorderBox: ts << "border-box"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, BreakBetween breakBetween)
+{
+    switch (breakBetween) {
+    case BreakBetween::Auto: ts << "auto"; break;
+    case BreakBetween::Avoid: ts << "avoid"; break;
+    case BreakBetween::AvoidColumn: ts << "avoid-column"; break;
+    case BreakBetween::AvoidPage: ts << "avoid-page"; break;
+    case BreakBetween::Column: ts << "column"; break;
+    case BreakBetween::Page: ts << "page"; break;
+    case BreakBetween::LeftPage: ts << "left-page"; break;
+    case BreakBetween::RightPage: ts << "right-page"; break;
+    case BreakBetween::RectoPage: ts << "recto-page"; break;
+    case BreakBetween::VersoPage: ts << "verso-page"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, BreakInside breakInside)
+{
+    switch (breakInside) {
+    case BreakInside::Auto: ts << "auto"; break;
+    case BreakInside::Avoid: ts << "avoid"; break;
+    case BreakInside::AvoidColumn: ts << "avoidColumn"; break;
+    case BreakInside::AvoidPage: ts << "avoidPage"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, CSSBoxType boxType)
+{
+    switch (boxType) {
+    case CSSBoxType::BoxMissing: ts << "missing"; break;
+    case CSSBoxType::MarginBox: ts << "margin-box"; break;
+    case CSSBoxType::BorderBox: ts << "border-box"; break;
+    case CSSBoxType::PaddingBox: ts << "padding-box"; break;
+    case CSSBoxType::ContentBox: ts << "content-box"; break;
+    case CSSBoxType::FillBox: ts << "fill-box"; break;
+    case CSSBoxType::StrokeBox: ts << "stroke-box"; break;
+    case CSSBoxType::ViewBox: ts << "view-box"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, CSSReflectionDirection direction)
+{
+    switch (direction) {
+    case ReflectionBelow: ts << "below"; break;
+    case ReflectionAbove: ts << "above"; break;
+    case ReflectionLeft: ts << "left"; break;
+    case ReflectionRight: ts << "right"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, CaptionSide side)
+{
+    switch (side) {
+    case CaptionSide::Top: ts << "top"; break;
+    case CaptionSide::Bottom: ts << "bottom"; break;
+    case CaptionSide::Left: ts << "left"; break;
+    case CaptionSide::Right: ts << "right"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, Clear clear)
+{
+    switch (clear) {
+    case Clear::None: ts << "none"; break;
+    case Clear::Left: ts << "left"; break;
+    case Clear::Right: ts << "right"; break;
+    case Clear::Both: ts << "both"; break;
+    }
+    return ts;
+}
+
+#if ENABLE(DARK_MODE_CSS)
+TextStream& operator<<(TextStream& ts, ColorScheme colorScheme)
+{
+    switch (colorScheme) {
+    case ColorScheme::Light: ts << "light"; break;
+    case ColorScheme::Dark: ts << "dark"; break;
+    }
+    return ts;
+}
+#endif
+
+TextStream& operator<<(TextStream& ts, ColumnAxis axis)
+{
+    switch (axis) {
+    case ColumnAxis::Horizontal: ts << "horizontal"; break;
+    case ColumnAxis::Vertical: ts << "vertical"; break;
+    case ColumnAxis::Auto: ts << "auto"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, ColumnFill fill)
+{
+    switch (fill) {
+    case ColumnFill::Auto: ts << "auto"; break;
+    case ColumnFill::Balance: ts << "balance"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, ColumnProgression progression)
+{
+    switch (progression) {
+    case ColumnProgression::Normal: ts << "normal"; break;
+    case ColumnProgression::Reverse: ts << "reverse"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, ColumnSpan span)
+{
+    switch (span) {
+    case ColumnSpan::None: ts << "none"; break;
+    case ColumnSpan::All: ts << "all"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, ContentDistribution distribution)
+{
+    switch (distribution) {
+    case ContentDistribution::Default: ts << "default"; break;
+    case ContentDistribution::SpaceBetween: ts << "space-between"; break;
+    case ContentDistribution::SpaceAround: ts << "space-around"; break;
+    case ContentDistribution::SpaceEvenly: ts << "space-evenly"; break;
+    case ContentDistribution::Stretch: ts << "stretch"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, ContentPosition position)
+{
+    switch (position) {
+    case ContentPosition::Normal: ts << "normal"; break;
+    case ContentPosition::Baseline: ts << "baseline"; break;
+    case ContentPosition::LastBaseline: ts << "last-baseline"; break;
+    case ContentPosition::Center: ts << "center"; break;
+    case ContentPosition::Start: ts << "start"; break;
+    case ContentPosition::End: ts << "end"; break;
+    case ContentPosition::FlexStart: ts << "flex-start"; break;
+    case ContentPosition::FlexEnd: ts << "flex-end"; break;
+    case ContentPosition::Left: ts << "left"; break;
+    case ContentPosition::Right: ts << "right"; break;
+
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, CursorType cursor)
+{
+    switch (cursor) {
+    case CursorType::Auto: ts << "auto"; break;
+    case CursorType::Default: ts << "default"; break;
+    case CursorType::ContextMenu: ts << "contextmenu"; break;
+    case CursorType::Help: ts << "help"; break;
+    case CursorType::Pointer: ts << "pointer"; break;
+    case CursorType::Progress: ts << "progress"; break;
+    case CursorType::Wait: ts << "wait"; break;
+    case CursorType::Cell: ts << "cell"; break;
+    case CursorType::Crosshair: ts << "crosshair"; break;
+    case CursorType::Text: ts << "text"; break;
+    case CursorType::VerticalText: ts << "vertical-text"; break;
+    case CursorType::Alias: ts << "alias"; break;
+    case CursorType::Move: ts << "move"; break;
+    case CursorType::NoDrop: ts << "nodrop"; break;
+    case CursorType::NotAllowed: ts << "not-allowed"; break;
+    case CursorType::Grab: ts << "grab"; break;
+    case CursorType::Grabbing: ts << "grabbing"; break;
+    case CursorType::EResize: ts << "e-resize"; break;
+    case CursorType::NResize: ts << "n-resize"; break;
+    case CursorType::NEResize: ts << "ne-resize"; break;
+    case CursorType::NWResize: ts << "nw-resize"; break;
+    case CursorType::SResize: ts << "sr-esize"; break;
+    case CursorType::SEResize: ts << "se-resize"; break;
+    case CursorType::SWResize: ts << "sw-resize"; break;
+    case CursorType::WResize: ts << "w-resize"; break;
+    case CursorType::EWResize: ts << "ew-resize"; break;
+    case CursorType::NSResize: ts << "ns-resize"; break;
+    case CursorType::NESWResize: ts << "nesw-resize"; break;
+    case CursorType::NWSEResize: ts << "nwse-resize"; break;
+    case CursorType::ColumnResize: ts << "column-resize"; break;
+    case CursorType::RowResize: ts << "row-resize"; break;
+    case CursorType::AllScroll: ts << "all-scroll"; break;
+    case CursorType::ZoomIn: ts << "zoom-in"; break;
+    case CursorType::ZoomOut: ts << "zoom-out"; break;
+    case CursorType::Copy: ts << "copy"; break;
+    case CursorType::None: ts << "none"; break;
+    }
+    return ts;
+}
+
+#if ENABLE(CURSOR_VISIBILITY)
+TextStream& operator<<(TextStream& ts, CursorVisibility visibility)
+{
+    switch (visibility) {
+    case CursorVisibility::Auto: ts << "auto"; break;
+    case CursorVisibility::AutoHide: ts << "autohide"; break;
+    }
+    return ts;
+}
+#endif
+
+TextStream& operator<<(TextStream& ts, DisplayType display)
+{
+    switch (display) {
+    case DisplayType::Inline: ts << "inline"; break;
+    case DisplayType::Block: ts << "block"; break;
+    case DisplayType::ListItem: ts << "list-item"; break;
+    case DisplayType::Compact: ts << "compact"; break;
+    case DisplayType::InlineBlock: ts << "inline-block"; break;
+    case DisplayType::Table: ts << "table"; break;
+    case DisplayType::InlineTable: ts << "inline-table"; break;
+    case DisplayType::TableRowGroup: ts << "table-row-group"; break;
+    case DisplayType::TableHeaderGroup: ts << "table-header-group"; break;
+    case DisplayType::TableFooterGroup: ts << "table-footer-group"; break;
+    case DisplayType::TableRow: ts << "table-row"; break;
+    case DisplayType::TableColumnGroup: ts << "table-column-group"; break;
+    case DisplayType::TableColumn: ts << "table-column"; break;
+    case DisplayType::TableCell: ts << "table-cell"; break;
+    case DisplayType::TableCaption: ts << "table-caption"; break;
+    case DisplayType::Box: ts << "box"; break;
+    case DisplayType::InlineBox: ts << "inline-box"; break;
+    case DisplayType::Flex: ts << "flex"; break;
+    case DisplayType::WebKitFlex: ts << "web-kit-flex"; break;
+    case DisplayType::InlineFlex: ts << "inline-flex"; break;
+    case DisplayType::WebKitInlineFlex: ts << "web-kit-inline-flex"; break;
+    case DisplayType::Contents: ts << "contents"; break;
+    case DisplayType::Grid: ts << "grid"; break;
+    case DisplayType::InlineGrid: ts << "inline-grid"; break;
+    case DisplayType::FlowRoot: ts << "flow-root"; break;
+    case DisplayType::None: ts << "none"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, Edge edge)
+{
+    switch (edge) {
+    case Edge::Top: ts << "top"; break;
+    case Edge::Right: ts << "right"; break;
+    case Edge::Bottom: ts << "bottom"; break;
+    case Edge::Left: ts << "left"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, EmptyCell emptyCell)
+{
+    switch (emptyCell) {
+    case EmptyCell::Show: ts << "show"; break;
+    case EmptyCell::Hide: ts << "hide"; break;
+    }
     return ts;
 }
 
@@ -95,7 +503,308 @@
     case FillRepeat::Round: ts << "round"; break;
     case FillRepeat::Space: ts << "space"; break;
     }
+    return ts;
+}
 
+TextStream& operator<<(TextStream& ts, FillSizeType sizeType)
+{
+    switch (sizeType) {
+    case FillSizeType::Contain: ts << "contain"; break;
+    case FillSizeType::Cover: ts << "cover"; break;
+    case FillSizeType::Size: ts << "size-length"; break;
+    case FillSizeType::None: ts << "size-none"; break;
+    }
+    
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, FlexDirection flexDirection)
+{
+    switch (flexDirection) {
+    case FlexDirection::Row: ts << "row"; break;
+    case FlexDirection::RowReverse: ts << "row-reverse"; break;
+    case FlexDirection::Column: ts << "column"; break;
+    case FlexDirection::ColumnReverse: ts << "column-reverse"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, FlexWrap flexWrap)
+{
+    switch (flexWrap) {
+    case FlexWrap::NoWrap: ts << "no-wrap"; break;
+    case FlexWrap::Wrap: ts << "wrap"; break;
+    case FlexWrap::Reverse: ts << "reverse"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, Float floating)
+{
+    switch (floating) {
+    case Float::No: ts << "none"; break;
+    case Float::Left: ts << "left"; break;
+    case Float::Right: ts << "right"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, GridAutoFlow gridAutoFlow)
+{
+    switch (gridAutoFlow) {
+    case AutoFlowRow: ts << "row"; break;
+    case AutoFlowColumn: ts << "column"; break;
+    case AutoFlowRowDense: ts << "row-dense"; break;
+    case AutoFlowColumnDense: ts << "column-dense"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, HangingPunctuation punctuation)
+{
+    switch (punctuation) {
+    case HangingPunctuation::None: ts << "none"; break;
+    case HangingPunctuation::First: ts << "first"; break;
+    case HangingPunctuation::Last: ts << "last"; break;
+    case HangingPunctuation::AllowEnd: ts << "allow-end"; break;
+    case HangingPunctuation::ForceEnd: ts << "force-end"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, Hyphens hyphens)
+{
+    switch (hyphens) {
+    case Hyphens::None: ts << "none"; break;
+    case Hyphens::Manual: ts << "manual"; break;
+    case Hyphens::Auto: ts << "auto"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, ImageRendering imageRendering)
+{
+    switch (imageRendering) {
+    case ImageRendering::Auto: ts << "auto"; break;
+    case ImageRendering::OptimizeSpeed: ts << "optimizeSpeed"; break;
+    case ImageRendering::OptimizeQuality: ts << "optimizeQuality"; break;
+    case ImageRendering::CrispEdges: ts << "crispEdges"; break;
+    case ImageRendering::Pixelated: ts << "pixelated"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, InsideLink inside)
+{
+    switch (inside) {
+    case InsideLink::NotInside: ts << "not-inside"; break;
+    case InsideLink::InsideUnvisited: ts << "inside-unvisited"; break;
+    case InsideLink::InsideVisited: ts << "inside-visited"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, Isolation isolation)
+{
+    switch (isolation) {
+    case Isolation::Auto: ts << "auto"; break;
+    case Isolation::Isolate: ts << "isolate"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, ItemPosition position)
+{
+    switch (position) {
+    case ItemPosition::Legacy: ts << "legacy"; break;
+    case ItemPosition::Auto: ts << "auto"; break;
+    case ItemPosition::Normal: ts << "normal"; break;
+    case ItemPosition::Stretch: ts << "stretch"; break;
+    case ItemPosition::Baseline: ts << "baseline"; break;
+    case ItemPosition::LastBaseline: ts << "last-baseline"; break;
+    case ItemPosition::Center: ts << "center"; break;
+    case ItemPosition::Start: ts << "start"; break;
+    case ItemPosition::End: ts << "end"; break;
+    case ItemPosition::SelfStart: ts << "self-start"; break;
+    case ItemPosition::SelfEnd: ts << "self-end"; break;
+    case ItemPosition::FlexStart: ts << "flex-start"; break;
+    case ItemPosition::FlexEnd: ts << "flex-end"; break;
+    case ItemPosition::Left: ts << "left"; break;
+    case ItemPosition::Right: ts << "right"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, ItemPositionType positionType)
+{
+    switch (positionType) {
+    case ItemPositionType::NonLegacy: ts << "non-legacy"; break;
+    case ItemPositionType::Legacy: ts << "legacy"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, LineAlign align)
+{
+    switch (align) {
+    case LineAlign::None: ts << "none"; break;
+    case LineAlign::Edges: ts << "edges"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, LineBreak lineBreak)
+{
+    switch (lineBreak) {
+    case LineBreak::Auto: ts << "auto"; break;
+    case LineBreak::Loose: ts << "loose"; break;
+    case LineBreak::Normal: ts << "normal"; break;
+    case LineBreak::Strict: ts << "strict"; break;
+    case LineBreak::AfterWhiteSpace: ts << "after-whiteSpace"; break;
+    case LineBreak::Anywhere: ts << "anywhere"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, LineSnap lineSnap)
+{
+    switch (lineSnap) {
+    case LineSnap::None: ts << "none"; break;
+    case LineSnap::Baseline: ts << "baseline"; break;
+    case LineSnap::Contain: ts << "contain"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, ListStylePosition position)
+{
+    switch (position) {
+    case ListStylePosition::Outside: ts << "outside"; break;
+    case ListStylePosition::Inside: ts << "inside"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, ListStyleType styleType)
+{
+    switch (styleType) {
+    case ListStyleType::Disc: ts << "disc"; break;
+    case ListStyleType::Circle: ts << "circle"; break;
+    case ListStyleType::Square: ts << "square"; break;
+    case ListStyleType::Decimal: ts << "decimal"; break;
+    case ListStyleType::DecimalLeadingZero: ts << "decimal-leading-zero"; break;
+    case ListStyleType::ArabicIndic: ts << "arabic-indic"; break;
+    case ListStyleType::Binary: ts << "binary"; break;
+    case ListStyleType::Bengali: ts << "bengali"; break;
+    case ListStyleType::Cambodian: ts << "cambodian"; break;
+    case ListStyleType::Khmer: ts << "khmer"; break;
+    case ListStyleType::Devanagari: ts << "devanagari"; break;
+    case ListStyleType::Gujarati: ts << "gujarati"; break;
+    case ListStyleType::Gurmukhi: ts << "gurmukhi"; break;
+    case ListStyleType::Kannada: ts << "kannada"; break;
+    case ListStyleType::LowerHexadecimal: ts << "lower-hexadecimal"; break;
+    case ListStyleType::Lao: ts << "lao"; break;
+    case ListStyleType::Malayalam: ts << "malayalam"; break;
+    case ListStyleType::Mongolian: ts << "mongolian"; break;
+    case ListStyleType::Myanmar: ts << "myanmar"; break;
+    case ListStyleType::Octal: ts << "octal"; break;
+    case ListStyleType::Oriya: ts << "oriya"; break;
+    case ListStyleType::Persian: ts << "persian"; break;
+    case ListStyleType::Urdu: ts << "urdu"; break;
+    case ListStyleType::Telugu: ts << "telugu"; break;
+    case ListStyleType::Tibetan: ts << "tibetan"; break;
+    case ListStyleType::Thai: ts << "thai"; break;
+    case ListStyleType::UpperHexadecimal: ts << "upper-hexadecimal"; break;
+    case ListStyleType::LowerRoman: ts << "lower-roman"; break;
+    case ListStyleType::UpperRoman: ts << "upper-roman"; break;
+    case ListStyleType::LowerGreek: ts << "lower-greek"; break;
+    case ListStyleType::LowerAlpha: ts << "lower-alpha"; break;
+    case ListStyleType::LowerLatin: ts << "lower-latin"; break;
+    case ListStyleType::UpperAlpha: ts << "upper-alpha"; break;
+    case ListStyleType::UpperLatin: ts << "upper-latin"; break;
+    case ListStyleType::Afar: ts << "afar"; break;
+    case ListStyleType::EthiopicHalehameAaEt: ts << "ethiopic-halehame-aa-et"; break;
+    case ListStyleType::EthiopicHalehameAaEr: ts << "ethiopic-halehame-aa-er"; break;
+    case ListStyleType::Amharic: ts << "amharic"; break;
+    case ListStyleType::EthiopicHalehameAmEt: ts << "ethiopic-halehame-am-et"; break;
+    case ListStyleType::AmharicAbegede: ts << "amharic-abegede"; break;
+    case ListStyleType::EthiopicAbegedeAmEt: ts << "ethiopic-abegede-am-et"; break;
+    case ListStyleType::CjkEarthlyBranch: ts << "cjk-earthly-branch"; break;
+    case ListStyleType::CjkHeavenlyStem: ts << "cjk-heavenly-stem"; break;
+    case ListStyleType::Ethiopic: ts << "ethiopic"; break;
+    case ListStyleType::EthiopicHalehameGez: ts << "ethiopic-halehame-gez"; break;
+    case ListStyleType::EthiopicAbegede: ts << "ethiopic-abegede"; break;
+    case ListStyleType::EthiopicAbegedeGez: ts << "ethiopic-abegede-gez"; break;
+    case ListStyleType::HangulConsonant: ts << "hangul-consonant"; break;
+    case ListStyleType::Hangul: ts << "hangul"; break;
+    case ListStyleType::LowerNorwegian: ts << "lower-norwegian"; break;
+    case ListStyleType::Oromo: ts << "oromo"; break;
+    case ListStyleType::EthiopicHalehameOmEt: ts << "ethiopic-halehame-om-et"; break;
+    case ListStyleType::Sidama: ts << "sidama"; break;
+    case ListStyleType::EthiopicHalehameSidEt: ts << "ethiopic-halehame-sid-et"; break;
+    case ListStyleType::Somali: ts << "somali"; break;
+    case ListStyleType::EthiopicHalehameSoEt: ts << "ethiopic-halehame-so-et"; break;
+    case ListStyleType::Tigre: ts << "tigre"; break;
+    case ListStyleType::EthiopicHalehameTig: ts << "ethiopic-halehame-tig"; break;
+    case ListStyleType::TigrinyaEr: ts << "tigrinya-er"; break;
+    case ListStyleType::EthiopicHalehameTiEr: ts << "ethiopic-halehame-ti-er"; break;
+    case ListStyleType::TigrinyaErAbegede: ts << "tigrinya-er-abegede"; break;
+    case ListStyleType::EthiopicAbegedeTiEr: ts << "ethiopic-abegede-ti-er"; break;
+    case ListStyleType::TigrinyaEt: ts << "tigrinya-et"; break;
+    case ListStyleType::EthiopicHalehameTiEt: ts << "ethiopic-halehame-ti-et"; break;
+    case ListStyleType::TigrinyaEtAbegede: ts << "tigrinya-et-abegede"; break;
+    case ListStyleType::EthiopicAbegedeTiEt: ts << "ethiopic-abegede-ti-et"; break;
+    case ListStyleType::UpperGreek: ts << "upper-greek"; break;
+    case ListStyleType::UpperNorwegian: ts << "upper-norwegian"; break;
+    case ListStyleType::Asterisks: ts << "asterisks"; break;
+    case ListStyleType::Footnotes: ts << "footnotes"; break;
+    case ListStyleType::Hebrew: ts << "hebrew"; break;
+    case ListStyleType::Armenian: ts << "armenian"; break;
+    case ListStyleType::LowerArmenian: ts << "lower-armenian"; break;
+    case ListStyleType::UpperArmenian: ts << "upper-armenian"; break;
+    case ListStyleType::Georgian: ts << "georgian"; break;
+    case ListStyleType::CJKIdeographic: ts << "cjk-ideographic"; break;
+    case ListStyleType::Hiragana: ts << "hiragana"; break;
+    case ListStyleType::Katakana: ts << "katakana"; break;
+    case ListStyleType::HiraganaIroha: ts << "hiragana-iroha"; break;
+    case ListStyleType::KatakanaIroha: ts << "katakana-iroha"; break;
+    case ListStyleType::None: ts << "none"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, MarginCollapse collapse)
+{
+    switch (collapse) {
+    case MarginCollapse::Collapse: ts << "collapse"; break;
+    case MarginCollapse::Separate: ts << "separate"; break;
+    case MarginCollapse::Discard: ts << "discard"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, MarqueeBehavior marqueeBehavior)
+{
+    switch (marqueeBehavior) {
+    case MarqueeBehavior::None: ts << "none"; break;
+    case MarqueeBehavior::Scroll: ts << "scroll"; break;
+    case MarqueeBehavior::Slide: ts << "slide"; break;
+    case MarqueeBehavior::Alternate: ts << "alternate"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, MarqueeDirection marqueeDirection)
+{
+    switch (marqueeDirection) {
+    case MarqueeDirection::Auto: ts << "auto"; break;
+    case MarqueeDirection::Left: ts << "left"; break;
+    case MarqueeDirection::Right: ts << "right"; break;
+    case MarqueeDirection::Up: ts << "up"; break;
+    case MarqueeDirection::Down: ts << "down"; break;
+    case MarqueeDirection::Forward: ts << "forward"; break;
+    case MarqueeDirection::Backward: ts << "backward"; break;
+    }
     return ts;
 }
 
@@ -109,13 +818,504 @@
     return ts;
 }
 
-TextStream& operator<<(TextStream& ts, Edge edge)
+TextStream& operator<<(TextStream& ts, NBSPMode mode)
 {
-    switch (edge) {
-    case Edge::Top: ts << "top"; break;
-    case Edge::Right: ts << "right"; break;
-    case Edge::Bottom: ts << "bottom"; break;
-    case Edge::Left: ts << "left"; break;
+    switch (mode) {
+    case NBSPMode::Normal: ts << "normal"; break;
+    case NBSPMode::Space: ts << "space"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, ObjectFit objectFit)
+{
+    switch (objectFit) {
+    case ObjectFit::Fill: ts << "fill"; break;
+    case ObjectFit::Contain: ts << "contain"; break;
+    case ObjectFit::Cover: ts << "cover"; break;
+    case ObjectFit::None: ts << "none"; break;
+    case ObjectFit::ScaleDown: ts << "scale-down"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, Order order)
+{
+    switch (order) {
+    case Order::Logical: ts << "logical"; break;
+    case Order::Visual: ts << "visual"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, Overflow overflow)
+{
+    switch (overflow) {
+    case Overflow::Visible: ts << "visible"; break;
+    case Overflow::Hidden: ts << "hidden"; break;
+    case Overflow::Scroll: ts << "scroll"; break;
+    case Overflow::Auto: ts << "auto"; break;
+    case Overflow::PagedX: ts << "paged-x"; break;
+    case Overflow::PagedY: ts << "paged-y"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, OverflowAlignment alignment)
+{
+    switch (alignment) {
+    case OverflowAlignment::Default: ts << "default"; break;
+    case OverflowAlignment::Unsafe: ts << "unsafe"; break;
+    case OverflowAlignment::Safe: ts << "safe"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, OverflowWrap overflowWrap)
+{
+    switch (overflowWrap) {
+    case OverflowWrap::Normal: ts << "normal"; break;
+    case OverflowWrap::Break: ts << "break"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, PaintOrder paintOrder)
+{
+    switch (paintOrder) {
+    case PaintOrder::Normal: ts << "normal"; break;
+    case PaintOrder::Fill: ts << "fill"; break;
+    case PaintOrder::FillMarkers: ts << "fill markers"; break;
+    case PaintOrder::Stroke: ts << "stroke"; break;
+    case PaintOrder::StrokeMarkers: ts << "stroke markers"; break;
+    case PaintOrder::Markers: ts << "markers"; break;
+    case PaintOrder::MarkersStroke: ts << "markers stroke"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, PointerEvents pointerEvents)
+{
+    switch (pointerEvents) {
+    case PointerEvents::None: ts << "none"; break;
+    case PointerEvents::Auto: ts << "auto"; break;
+    case PointerEvents::Stroke: ts << "stroke"; break;
+    case PointerEvents::Fill: ts << "fill"; break;
+    case PointerEvents::Painted: ts << "painted"; break;
+    case PointerEvents::Visible: ts << "visible"; break;
+    case PointerEvents::VisibleStroke: ts << "visible-stroke"; break;
+    case PointerEvents::VisibleFill: ts << "visible-fill"; break;
+    case PointerEvents::VisiblePainted: ts << "visible-painted"; break;
+    case PointerEvents::All: ts << "all"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, PositionType position)
+{
+    switch (position) {
+    case PositionType::Static: ts << "static"; break;
+    case PositionType::Relative: ts << "relative"; break;
+    case PositionType::Absolute: ts << "absolute"; break;
+    case PositionType::Sticky: ts << "sticky"; break;
+    case PositionType::Fixed: ts << "fixed"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, PrintColorAdjust colorAdjust)
+{
+    switch (colorAdjust) {
+    case PrintColorAdjust::Economy: ts << "economy"; break;
+    case PrintColorAdjust::Exact: ts << "exact"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, PseudoId pseudoId)
+{
+    switch (pseudoId) {
+    case PseudoId::None: ts << "none"; break;
+    case PseudoId::FirstLine: ts << "first-line"; break;
+    case PseudoId::FirstLetter: ts << "first-letter"; break;
+    case PseudoId::Marker: ts << "marker"; break;
+    case PseudoId::Before: ts << "before"; break;
+    case PseudoId::After: ts << "after"; break;
+    case PseudoId::Selection: ts << "selection"; break;
+    case PseudoId::Scrollbar: ts << "scrollbar"; break;
+    case PseudoId::ScrollbarThumb: ts << "scrollbar-thumb"; break;
+    case PseudoId::ScrollbarButton: ts << "scrollbar-button"; break;
+    case PseudoId::ScrollbarTrack: ts << "scrollbar-track"; break;
+    case PseudoId::ScrollbarTrackPiece: ts << "scrollbar-trackpiece"; break;
+    case PseudoId::ScrollbarCorner: ts << "scrollbar-corner"; break;
+    case PseudoId::Resizer: ts << "resizer"; break;
+    default:
+        ts << "other";
+        break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, QuoteType quoteType)
+{
+    switch (quoteType) {
+    case QuoteType::OpenQuote: ts << "open"; break;
+    case QuoteType::CloseQuote: ts << "close"; break;
+    case QuoteType::NoOpenQuote: ts << "no-open"; break;
+    case QuoteType::NoCloseQuote: ts << "no-close"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, Resize resize)
+{
+    switch (resize) {
+    case Resize::None: ts << "none"; break;
+    case Resize::Both: ts << "both"; break;
+    case Resize::Horizontal: ts << "horizontal"; break;
+    case Resize::Vertical: ts << "vertical"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, RubyPosition position)
+{
+    switch (position) {
+    case RubyPosition::Before: ts << "before"; break;
+    case RubyPosition::After: ts << "after"; break;
+    case RubyPosition::InterCharacter: ts << "inter-character"; break;
+    }
+    return ts;
+}
+
+#if ENABLE(CSS_SCROLL_SNAP)
+TextStream& operator<<(TextStream& ts, ScrollSnapAxis axis)
+{
+    switch (axis) {
+    case ScrollSnapAxis::XAxis: ts << "x-axis"; break;
+    case ScrollSnapAxis::YAxis: ts << "y-Axis"; break;
+    case ScrollSnapAxis::Block: ts << "block"; break;
+    case ScrollSnapAxis::Inline: ts << "inline"; break;
+    case ScrollSnapAxis::Both: ts << "both"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, ScrollSnapAxisAlignType alignType)
+{
+    switch (alignType) {
+    case ScrollSnapAxisAlignType::None: ts << "none"; break;
+    case ScrollSnapAxisAlignType::Start: ts << "start"; break;
+    case ScrollSnapAxisAlignType::Center: ts << "center"; break;
+    case ScrollSnapAxisAlignType::End: ts << "end"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, ScrollSnapStrictness strictness)
+{
+    switch (strictness) {
+    case ScrollSnapStrictness::None: ts << "none"; break;
+    case ScrollSnapStrictness::Proximity: ts << "proximity"; break;
+    case ScrollSnapStrictness::Mandatory: ts << "mandatory"; break;
+    }
+    return ts;
+}
+#endif
+
+TextStream& operator<<(TextStream& ts, SpeakAs speakAs)
+{
+    switch (speakAs) {
+    case SpeakAs::Normal: ts << "normal"; break;
+    case SpeakAs::SpellOut: ts << "spell-out"; break;
+    case SpeakAs::Digits: ts << "digits"; break;
+    case SpeakAs::LiteralPunctuation: ts << "literal-punctuation"; break;
+    case SpeakAs::NoPunctuation: ts << "no-punctuation"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, StyleDifference diff)
+{
+    switch (diff) {
+    case StyleDifference::Equal: ts << "equal"; break;
+    case StyleDifference::RecompositeLayer: ts << "recomposite layer"; break;
+    case StyleDifference::Repaint: ts << "repaint"; break;
+    case StyleDifference::RepaintIfTextOrBorderOrOutline: ts << "repaint if text or border or outline"; break;
+    case StyleDifference::RepaintLayer: ts << "repaint layer"; break;
+    case StyleDifference::LayoutPositionedMovementOnly: ts << "layout positioned movement only"; break;
+    case StyleDifference::SimplifiedLayout: ts << "simplified layout"; break;
+    case StyleDifference::SimplifiedLayoutAndPositionedMovement: ts << "simplified layout and positioned movement"; break;
+    case StyleDifference::Layout: ts << "layout"; break;
+    case StyleDifference::NewStyle: ts << "new style"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, TableLayoutType layoutType)
+{
+    switch (layoutType) {
+    case TableLayoutType::Auto: ts << "Auto"; break;
+    case TableLayoutType::Fixed: ts << "Fixed"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, TextAlignMode alignMode)
+{
+    switch (alignMode) {
+    case TextAlignMode::Left: ts << "left"; break;
+    case TextAlignMode::Right: ts << "right"; break;
+    case TextAlignMode::Center: ts << "center"; break;
+    case TextAlignMode::Justify: ts << "justify"; break;
+    case TextAlignMode::WebKitLeft: ts << "webkit-left"; break;
+    case TextAlignMode::WebKitRight: ts << "webkit-right"; break;
+    case TextAlignMode::WebKitCenter: ts << "webkit-center"; break;
+    case TextAlignMode::Start: ts << "start"; break;
+    case TextAlignMode::End: ts << "end"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, TextCombine textCombine)
+{
+    switch (textCombine) {
+    case TextCombine::None: ts << "none"; break;
+    case TextCombine::Horizontal: ts << "horizontal"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, TextDecoration textDecoration)
+{
+    switch (textDecoration) {
+    case TextDecoration::None: ts << "none"; break;
+    case TextDecoration::Underline: ts << "underline"; break;
+    case TextDecoration::Overline: ts << "overline"; break;
+    case TextDecoration::LineThrough: ts << "line-through"; break;
+    case TextDecoration::Blink: ts << "blink"; break;
+#if ENABLE(LETTERPRESS)
+    case TextDecoration::Letterpress: ts << "letterpress"; break;
+#endif
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, TextDecorationSkip skip)
+{
+    switch (skip) {
+    case TextDecorationSkip::None: ts << "none"; break;
+    case TextDecorationSkip::Ink: ts << "ink"; break;
+    case TextDecorationSkip::Objects: ts << "objects"; break;
+    case TextDecorationSkip::Auto: ts << "auto"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, TextDecorationStyle decorationStyle)
+{
+    switch (decorationStyle) {
+    case TextDecorationStyle::Solid: ts << "solid"; break;
+    case TextDecorationStyle::Double: ts << "double"; break;
+    case TextDecorationStyle::Dotted: ts << "dotted"; break;
+    case TextDecorationStyle::Dashed: ts << "dashed"; break;
+    case TextDecorationStyle::Wavy: ts << "wavy"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, TextEmphasisFill fill)
+{
+    switch (fill) {
+    case TextEmphasisFill::Filled: ts << "filled"; break;
+    case TextEmphasisFill::Open: ts << "open"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, TextEmphasisMark mark)
+{
+    switch (mark) {
+    case TextEmphasisMark::None: ts << "none"; break;
+    case TextEmphasisMark::Auto: ts << "auto"; break;
+    case TextEmphasisMark::Dot: ts << "dot"; break;
+    case TextEmphasisMark::Circle: ts << "circle"; break;
+    case TextEmphasisMark::DoubleCircle: ts << "double-circle"; break;
+    case TextEmphasisMark::Triangle: ts << "triangle"; break;
+    case TextEmphasisMark::Sesame: ts << "sesame"; break;
+    case TextEmphasisMark::Custom: ts << "custom"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, TextEmphasisPosition position)
+{
+    switch (position) {
+    case TextEmphasisPosition::Over: ts << "Over"; break;
+    case TextEmphasisPosition::Under: ts << "Under"; break;
+    case TextEmphasisPosition::Left: ts << "Left"; break;
+    case TextEmphasisPosition::Right: ts << "Right"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, TextOrientation orientation)
+{
+    switch (orientation) {
+    case TextOrientation::Mixed: ts << "mixed"; break;
+    case TextOrientation::Upright: ts << "upright"; break;
+    case TextOrientation::Sideways: ts << "sideways"; break;
+    }
+    return ts;
+}
+TextStream& operator<<(TextStream& ts, TextOverflow overflow)
+{
+    switch (overflow) {
+    case TextOverflow::Clip: ts << "clip"; break;
+    case TextOverflow::Ellipsis: ts << "ellipsis"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, TextSecurity textSecurity)
+{
+    switch (textSecurity) {
+    case TextSecurity::None: ts << "none"; break;
+    case TextSecurity::Disc: ts << "disc"; break;
+    case TextSecurity::Circle: ts << "circle"; break;
+    case TextSecurity::Square: ts << "square"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, TextTransform textTransform)
+{
+    switch (textTransform) {
+    case TextTransform::Capitalize: ts << "capitalize"; break;
+    case TextTransform::Uppercase: ts << "uppercase"; break;
+    case TextTransform::Lowercase: ts << "lowercase"; break;
+    case TextTransform::None: ts << "none"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, TextUnderlinePosition underlinePosition)
+{
+    switch (underlinePosition) {
+    case TextUnderlinePosition::Auto: ts << "Auto"; break;
+    case TextUnderlinePosition::Under: ts << "Under"; break;
+    case TextUnderlinePosition::FromFont: ts << "FromFont"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, TextZoom zoom)
+{
+    switch (zoom) {
+    case TextZoom::Normal: ts << "normal"; break;
+    case TextZoom::Reset: ts << "reset"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, TransformBox box)
+{
+    switch (box) {
+    case TransformBox::BorderBox: ts << "border-box"; break;
+    case TransformBox::FillBox: ts << "fill-box"; break;
+    case TransformBox::ViewBox: ts << "view-box"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, TransformStyle3D transformStyle)
+{
+    switch (transformStyle) {
+    case TransformStyle3D::Flat: ts << "flat"; break;
+    case TransformStyle3D::Preserve3D: ts << "preserve-3d"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, UserDrag userDrag)
+{
+    switch (userDrag) {
+    case UserDrag::Auto: ts << "auto"; break;
+    case UserDrag::None: ts << "none"; break;
+    case UserDrag::Element: ts << "element"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, UserModify userModify)
+{
+    switch (userModify) {
+    case UserModify::ReadOnly: ts << "read-only"; break;
+    case UserModify::ReadWrite: ts << "read-write"; break;
+    case UserModify::ReadWritePlaintextOnly: ts << "read-write plaintext only"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, UserSelect userSelect)
+{
+    switch (userSelect) {
+    case UserSelect::None: ts << "none"; break;
+    case UserSelect::Text: ts << "text"; break;
+    case UserSelect::All: ts << "all"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, VerticalAlign verticalAlign)
+{
+    switch (verticalAlign) {
+    case VerticalAlign::Baseline: ts << "baseline"; break;
+    case VerticalAlign::Middle: ts << "middle"; break;
+    case VerticalAlign::Sub: ts << "sub"; break;
+    case VerticalAlign::Super: ts << "super"; break;
+    case VerticalAlign::TextTop: ts << "text-top"; break;
+    case VerticalAlign::TextBottom: ts << "text-bottom"; break;
+    case VerticalAlign::Top: ts << "top"; break;
+    case VerticalAlign::Bottom: ts << "bottom"; break;
+    case VerticalAlign::BaselineMiddle: ts << "baseline-middle"; break;
+    case VerticalAlign::Length: ts << "length"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, Visibility visibility)
+{
+    switch (visibility) {
+    case Visibility::Visible: ts << "visible"; break;
+    case Visibility::Hidden: ts << "hidden"; break;
+    case Visibility::Collapse: ts << "collapse"; break;
+    }
+    
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, WhiteSpace whiteSpace)
+{
+    switch (whiteSpace) {
+    case WhiteSpace::Normal: ts << "normal"; break;
+    case WhiteSpace::Pre: ts << "pre"; break;
+    case WhiteSpace::PreWrap: ts << "pre-wrap"; break;
+    case WhiteSpace::PreLine: ts << "pre-line"; break;
+    case WhiteSpace::NoWrap: ts << "nowrap"; break;
+    case WhiteSpace::KHTMLNoWrap: ts << "khtml-nowrap"; break;
+    case WhiteSpace::BreakSpaces: ts << "break-spaces"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, WordBreak wordBreak)
+{
+    switch (wordBreak) {
+    case WordBreak::Normal: ts << "normal"; break;
+    case WordBreak::BreakAll: ts << "break-all"; break;
+    case WordBreak::KeepAll: ts << "keep-all"; break;
+    case WordBreak::BreakWord: ts << "break-word"; break;
     }
     return ts;
 }
diff --git a/Source/WebCore/rendering/style/RenderStyleConstants.h b/Source/WebCore/rendering/style/RenderStyleConstants.h
index 6d6ffbe..3d55eab 100644
--- a/Source/WebCore/rendering/style/RenderStyleConstants.h
+++ b/Source/WebCore/rendering/style/RenderStyleConstants.h
@@ -25,6 +25,7 @@
 
 #pragma once
 
+#include "CSSReflectionDirection.h" // FIXME: CSSReflectionDirection should just move here.
 #include <initializer_list>
 
 namespace WTF {
@@ -797,8 +798,6 @@
     Collapse
 };
 
-WTF::TextStream& operator<<(WTF::TextStream&, Visibility);
-
 enum class CursorType : uint8_t {
     // The following must match the order in CSSValueKeywords.in.
     Auto,
@@ -976,8 +975,6 @@
     Pixelated
 };
 
-WTF::TextStream& operator<<(WTF::TextStream&, ImageRendering);
-
 enum class ImageResolutionSource : uint8_t {
     Specified = 0,
     FromImage
@@ -1138,13 +1135,6 @@
 };
 #endif
 
-WTF::TextStream& operator<<(WTF::TextStream&, FillSizeType);
-WTF::TextStream& operator<<(WTF::TextStream&, FillAttachment);
-WTF::TextStream& operator<<(WTF::TextStream&, FillBox);
-WTF::TextStream& operator<<(WTF::TextStream&, FillRepeat);
-WTF::TextStream& operator<<(WTF::TextStream&, MaskSourceType);
-WTF::TextStream& operator<<(WTF::TextStream&, Edge);
-
 // These are all minimized combinations of paint-order.
 enum class PaintOrder : uint8_t {
     Normal,
@@ -1172,4 +1162,115 @@
 
 extern const float defaultMiterLimit;
 
+WTF::TextStream& operator<<(WTF::TextStream&, AnimationFillMode);
+WTF::TextStream& operator<<(WTF::TextStream&, AnimationPlayState);
+#if ENABLE(APPLE_PAY)
+WTF::TextStream& operator<<(WTF::TextStream&, ApplePayButtonStyle);
+WTF::TextStream& operator<<(WTF::TextStream&, ApplePayButtonType);
+#endif
+WTF::TextStream& operator<<(WTF::TextStream&, AspectRatioType);
+WTF::TextStream& operator<<(WTF::TextStream&, AutoRepeatType);
+WTF::TextStream& operator<<(WTF::TextStream&, BackfaceVisibility);
+WTF::TextStream& operator<<(WTF::TextStream&, BorderCollapse);
+WTF::TextStream& operator<<(WTF::TextStream&, BorderFit);
+WTF::TextStream& operator<<(WTF::TextStream&, BorderStyle);
+WTF::TextStream& operator<<(WTF::TextStream&, BoxAlignment);
+WTF::TextStream& operator<<(WTF::TextStream&, BoxDecorationBreak);
+WTF::TextStream& operator<<(WTF::TextStream&, BoxDirection);
+WTF::TextStream& operator<<(WTF::TextStream&, BoxLines);
+WTF::TextStream& operator<<(WTF::TextStream&, BoxOrient);
+WTF::TextStream& operator<<(WTF::TextStream&, BoxPack);
+WTF::TextStream& operator<<(WTF::TextStream&, BoxSizing);
+WTF::TextStream& operator<<(WTF::TextStream&, BreakBetween);
+WTF::TextStream& operator<<(WTF::TextStream&, BreakInside);
+WTF::TextStream& operator<<(WTF::TextStream&, CSSBoxType);
+WTF::TextStream& operator<<(WTF::TextStream&, CSSReflectionDirection);
+WTF::TextStream& operator<<(WTF::TextStream&, CaptionSide);
+WTF::TextStream& operator<<(WTF::TextStream&, Clear);
+#if ENABLE(DARK_MODE_CSS)
+WTF::TextStream& operator<<(WTF::TextStream&, ColorScheme);
+#endif
+WTF::TextStream& operator<<(WTF::TextStream&, ColumnAxis);
+WTF::TextStream& operator<<(WTF::TextStream&, ColumnFill);
+WTF::TextStream& operator<<(WTF::TextStream&, ColumnProgression);
+WTF::TextStream& operator<<(WTF::TextStream&, ColumnSpan);
+WTF::TextStream& operator<<(WTF::TextStream&, ContentDistribution);
+WTF::TextStream& operator<<(WTF::TextStream&, ContentPosition);
+WTF::TextStream& operator<<(WTF::TextStream&, CursorType);
+#if ENABLE(CURSOR_VISIBILITY)
+WTF::TextStream& operator<<(WTF::TextStream&, CursorVisibility);
+#endif
+WTF::TextStream& operator<<(WTF::TextStream&, DisplayType);
+WTF::TextStream& operator<<(WTF::TextStream&, Edge);
+WTF::TextStream& operator<<(WTF::TextStream&, EmptyCell);
+WTF::TextStream& operator<<(WTF::TextStream&, FillAttachment);
+WTF::TextStream& operator<<(WTF::TextStream&, FillBox);
+WTF::TextStream& operator<<(WTF::TextStream&, FillRepeat);
+WTF::TextStream& operator<<(WTF::TextStream&, FillSizeType);
+WTF::TextStream& operator<<(WTF::TextStream&, FlexDirection);
+WTF::TextStream& operator<<(WTF::TextStream&, FlexWrap);
+WTF::TextStream& operator<<(WTF::TextStream&, Float);
+WTF::TextStream& operator<<(WTF::TextStream&, GridAutoFlow);
+WTF::TextStream& operator<<(WTF::TextStream&, HangingPunctuation);
+WTF::TextStream& operator<<(WTF::TextStream&, Hyphens);
+WTF::TextStream& operator<<(WTF::TextStream&, ImageRendering);
+WTF::TextStream& operator<<(WTF::TextStream&, InsideLink);
+WTF::TextStream& operator<<(WTF::TextStream&, Isolation);
+WTF::TextStream& operator<<(WTF::TextStream&, ItemPosition);
+WTF::TextStream& operator<<(WTF::TextStream&, ItemPositionType);
+WTF::TextStream& operator<<(WTF::TextStream&, LineAlign);
+WTF::TextStream& operator<<(WTF::TextStream&, LineBreak);
+WTF::TextStream& operator<<(WTF::TextStream&, LineSnap);
+WTF::TextStream& operator<<(WTF::TextStream&, ListStylePosition);
+WTF::TextStream& operator<<(WTF::TextStream&, ListStyleType);
+WTF::TextStream& operator<<(WTF::TextStream&, MarginCollapse);
+WTF::TextStream& operator<<(WTF::TextStream&, MarqueeBehavior);
+WTF::TextStream& operator<<(WTF::TextStream&, MarqueeDirection);
+WTF::TextStream& operator<<(WTF::TextStream&, MaskSourceType);
+WTF::TextStream& operator<<(WTF::TextStream&, NBSPMode);
+WTF::TextStream& operator<<(WTF::TextStream&, ObjectFit);
+WTF::TextStream& operator<<(WTF::TextStream&, Order);
+WTF::TextStream& operator<<(WTF::TextStream&, WebCore::Overflow);
+WTF::TextStream& operator<<(WTF::TextStream&, OverflowAlignment);
+WTF::TextStream& operator<<(WTF::TextStream&, OverflowWrap);
+WTF::TextStream& operator<<(WTF::TextStream&, PaintOrder);
+WTF::TextStream& operator<<(WTF::TextStream&, PointerEvents);
+WTF::TextStream& operator<<(WTF::TextStream&, PositionType);
+WTF::TextStream& operator<<(WTF::TextStream&, PrintColorAdjust);
+WTF::TextStream& operator<<(WTF::TextStream&, PseudoId);
+WTF::TextStream& operator<<(WTF::TextStream&, QuoteType);
+WTF::TextStream& operator<<(WTF::TextStream&, Resize);
+WTF::TextStream& operator<<(WTF::TextStream&, RubyPosition);
+#if ENABLE(CSS_SCROLL_SNAP)
+WTF::TextStream& operator<<(WTF::TextStream&, ScrollSnapAxis);
+WTF::TextStream& operator<<(WTF::TextStream&, ScrollSnapAxisAlignType);
+WTF::TextStream& operator<<(WTF::TextStream&, ScrollSnapStrictness);
+#endif
+WTF::TextStream& operator<<(WTF::TextStream&, SpeakAs);
+WTF::TextStream& operator<<(WTF::TextStream&, StyleDifference);
+WTF::TextStream& operator<<(WTF::TextStream&, TableLayoutType);
+WTF::TextStream& operator<<(WTF::TextStream&, TextAlignMode);
+WTF::TextStream& operator<<(WTF::TextStream&, TextCombine);
+WTF::TextStream& operator<<(WTF::TextStream&, TextDecoration);
+WTF::TextStream& operator<<(WTF::TextStream&, TextDecorationSkip);
+WTF::TextStream& operator<<(WTF::TextStream&, TextDecorationStyle);
+WTF::TextStream& operator<<(WTF::TextStream&, TextEmphasisFill);
+WTF::TextStream& operator<<(WTF::TextStream&, TextEmphasisMark);
+WTF::TextStream& operator<<(WTF::TextStream&, TextEmphasisPosition);
+WTF::TextStream& operator<<(WTF::TextStream&, TextOrientation);
+WTF::TextStream& operator<<(WTF::TextStream&, TextOverflow);
+WTF::TextStream& operator<<(WTF::TextStream&, TextSecurity);
+WTF::TextStream& operator<<(WTF::TextStream&, TextTransform);
+WTF::TextStream& operator<<(WTF::TextStream&, TextUnderlinePosition);
+WTF::TextStream& operator<<(WTF::TextStream&, TextZoom);
+WTF::TextStream& operator<<(WTF::TextStream&, TransformBox);
+WTF::TextStream& operator<<(WTF::TextStream&, TransformStyle3D);
+WTF::TextStream& operator<<(WTF::TextStream&, UserDrag);
+WTF::TextStream& operator<<(WTF::TextStream&, UserModify);
+WTF::TextStream& operator<<(WTF::TextStream&, UserSelect);
+WTF::TextStream& operator<<(WTF::TextStream&, VerticalAlign);
+WTF::TextStream& operator<<(WTF::TextStream&, Visibility);
+WTF::TextStream& operator<<(WTF::TextStream&, WhiteSpace);
+WTF::TextStream& operator<<(WTF::TextStream&, WordBreak);
+
 } // namespace WebCore
diff --git a/Source/WebCore/rendering/style/SVGRenderStyleDefs.cpp b/Source/WebCore/rendering/style/SVGRenderStyleDefs.cpp
index 581b07c..d3fa927 100644
--- a/Source/WebCore/rendering/style/SVGRenderStyleDefs.cpp
+++ b/Source/WebCore/rendering/style/SVGRenderStyleDefs.cpp
@@ -32,6 +32,7 @@
 #include "RenderStyle.h"
 #include "SVGRenderStyle.h"
 #include <wtf/PointerComparison.h>
+#include <wtf/text/TextStream.h>
 
 namespace WebCore {
 
@@ -305,4 +306,231 @@
         && y == other.y;
 }
 
+
+TextStream& operator<<(TextStream& ts, AlignmentBaseline value)
+{
+    switch (value) {
+    case AlignmentBaseline::Auto: ts << "auto"; break;
+    case AlignmentBaseline::Baseline: ts << "baseline"; break;
+    case AlignmentBaseline::BeforeEdge: ts << "before-edge"; break;
+    case AlignmentBaseline::TextBeforeEdge: ts << "text-before-edge"; break;
+    case AlignmentBaseline::Middle: ts << "middle"; break;
+    case AlignmentBaseline::Central: ts << "central"; break;
+    case AlignmentBaseline::AfterEdge: ts << "after-edge"; break;
+    case AlignmentBaseline::TextAfterEdge: ts << "text-after-edge"; break;
+    case AlignmentBaseline::Ideographic: ts << "ideographic"; break;
+    case AlignmentBaseline::Alphabetic: ts << "alphabetic"; break;
+    case AlignmentBaseline::Hanging: ts << "hanging"; break;
+    case AlignmentBaseline::Mathematical: ts << "mathematical"; break;
+    }
+    return ts;
 }
+
+TextStream& operator<<(TextStream& ts, BaselineShift value)
+{
+    switch (value) {
+    case BaselineShift::Baseline: ts << "baseline"; break;
+    case BaselineShift::Sub: ts << "sub"; break;
+    case BaselineShift::Super: ts << "super"; break;
+    case BaselineShift::Length: ts << "length"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, BufferedRendering value)
+{
+    switch (value) {
+    case BufferedRendering::Auto: ts << "auto"; break;
+    case BufferedRendering::Dynamic: ts << "dynamic"; break;
+    case BufferedRendering::Static: ts << "static"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, ColorInterpolation value)
+{
+    switch (value) {
+    case ColorInterpolation::Auto: ts << "auto"; break;
+    case ColorInterpolation::SRGB: ts << "sRGB"; break;
+    case ColorInterpolation::LinearRGB: ts << "linearRGB"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, ColorRendering value)
+{
+    switch (value) {
+    case ColorRendering::Auto: ts << "auto"; break;
+    case ColorRendering::OptimizeSpeed: ts << "optimizeSpeed"; break;
+    case ColorRendering::OptimizeQuality: ts << "optimizeQuality"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, DominantBaseline value)
+{
+    switch (value) {
+    case DominantBaseline::Auto: ts << "auto"; break;
+    case DominantBaseline::UseScript: ts << "use-script"; break;
+    case DominantBaseline::NoChange: ts << "no-change"; break;
+    case DominantBaseline::ResetSize: ts << "reset-size"; break;
+    case DominantBaseline::Ideographic: ts << "ideographic"; break;
+    case DominantBaseline::Alphabetic: ts << "alphabetic"; break;
+    case DominantBaseline::Hanging: ts << "hanging"; break;
+    case DominantBaseline::Mathematical: ts << "mathematical"; break;
+    case DominantBaseline::Central: ts << "central"; break;
+    case DominantBaseline::Middle: ts << "middle"; break;
+    case DominantBaseline::TextAfterEdge: ts << "text-after-edge"; break;
+    case DominantBaseline::TextBeforeEdge: ts << "text-before-edge"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, GlyphOrientation value)
+{
+    switch (value) {
+    case GlyphOrientation::Degrees0: ts << "0"; break;
+    case GlyphOrientation::Degrees90: ts << "90"; break;
+    case GlyphOrientation::Degrees180: ts << "180"; break;
+    case GlyphOrientation::Degrees270: ts << "270"; break;
+    case GlyphOrientation::Auto: ts << "Auto"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, MaskType value)
+{
+    switch (value) {
+    case MaskType::Luminance: ts << "luminance"; break;
+    case MaskType::Alpha: ts << "alpha"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, SVGPaintType paintType)
+{
+    switch (paintType) {
+    case SVGPaintType::RGBColor: ts << "rgb-color"; break;
+    case SVGPaintType::None: ts << "none"; break;
+    case SVGPaintType::CurrentColor: ts << "current-color"; break;
+    case SVGPaintType::URINone: ts << "uri-none"; break;
+    case SVGPaintType::URICurrentColor: ts << "uri-current-color"; break;
+    case SVGPaintType::URIRGBColor: ts << "uri-rgb-color"; break;
+    case SVGPaintType::URI: ts << "uri"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, ShapeRendering value)
+{
+    switch (value) {
+    case ShapeRendering::Auto: ts << "auto"; break;
+    case ShapeRendering::OptimizeSpeed: ts << "optimizeSpeed"; break;
+    case ShapeRendering::CrispEdges: ts << "crispEdges"; break;
+    case ShapeRendering::GeometricPrecision: ts << "geometricPrecision"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, TextAnchor value)
+{
+    switch (value) {
+    case TextAnchor::Start: ts << "start"; break;
+    case TextAnchor::Middle: ts << "middle"; break;
+    case TextAnchor::End: ts << "end"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, VectorEffect value)
+{
+    switch (value) {
+    case VectorEffect::None: ts << "none"; break;
+    case VectorEffect::NonScalingStroke: ts << "non-scaling-stroke"; break;
+    }
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, const StyleFillData& data)
+{
+    ts.dumpProperty("opacity", data.opacity);
+    ts.dumpProperty("paint-color", data.paintColor);
+    ts.dumpProperty("visited link paint-color", data.visitedLinkPaintColor);
+    ts.dumpProperty("paint uri", data.paintUri);
+    ts.dumpProperty("visited link paint uri", data.visitedLinkPaintUri);
+    ts.dumpProperty("visited link paint type", data.paintType);
+    ts.dumpProperty("visited link paint type", data.visitedLinkPaintType);
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, const StyleStrokeData& data)
+{
+    ts.dumpProperty("opacity", data.opacity);
+    ts.dumpProperty("paint-color", data.paintColor);
+    ts.dumpProperty("visited link paint-color", data.visitedLinkPaintColor);
+    ts.dumpProperty("paint uri", data.paintUri);
+    ts.dumpProperty("visited link paint uri", data.visitedLinkPaintUri);
+    ts.dumpProperty("dashOffset", data.dashOffset);
+    ts.dumpProperty("dash array", data.dashArray);
+    ts.dumpProperty("visited link paint type", data.paintType);
+    ts.dumpProperty("visited link paint type", data.visitedLinkPaintType);
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, const StyleStopData& data)
+{
+    ts.dumpProperty("opacity", data.opacity);
+    ts.dumpProperty("color", data.color);
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, const StyleTextData& data)
+{
+    ts.dumpProperty("kerning", data.kerning);
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, const StyleMiscData& data)
+{
+    ts.dumpProperty("flood-opacity", data.floodOpacity);
+    ts.dumpProperty("flood-color", data.floodColor);
+    ts.dumpProperty("lighting-color", data.lightingColor);
+    ts.dumpProperty("baseline-shift", data.baselineShiftValue);
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, const StyleShadowSVGData& data)
+{
+    if (data.shadow)
+        ts.dumpProperty("shadow", *data.shadow);
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, const StyleResourceData& data)
+{
+    ts.dumpProperty("clipper", data.clipper);
+    ts.dumpProperty("masker", data.masker);
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, const StyleInheritedResourceData& data)
+{
+    ts.dumpProperty("marker-start", data.markerStart);
+    ts.dumpProperty("marker-mid", data.markerMid);
+    ts.dumpProperty("marker-end", data.markerEnd);
+    return ts;
+}
+
+TextStream& operator<<(TextStream& ts, const StyleLayoutData& data)
+{
+    ts.dumpProperty("cx", data.cx);
+    ts.dumpProperty("cy", data.cy);
+    ts.dumpProperty("r", data.r);
+    ts.dumpProperty("rx", data.rx);
+    ts.dumpProperty("ry", data.ry);
+    ts.dumpProperty("x", data.x);
+    ts.dumpProperty("y", data.y);
+    return ts;
+}
+
+} // namespace WebCore
diff --git a/Source/WebCore/rendering/style/SVGRenderStyleDefs.h b/Source/WebCore/rendering/style/SVGRenderStyleDefs.h
index d87a8d3..ee0e703 100644
--- a/Source/WebCore/rendering/style/SVGRenderStyleDefs.h
+++ b/Source/WebCore/rendering/style/SVGRenderStyleDefs.h
@@ -34,6 +34,10 @@
 #include <wtf/RefCounted.h>
 #include <wtf/RefPtr.h>
 
+namespace WTF {
+class TextStream;
+}
+
 namespace WebCore {
 
 class CSSValue;
@@ -336,4 +340,28 @@
     StyleLayoutData(const StyleLayoutData&);
 };
 
+
+WTF::TextStream& operator<<(WTF::TextStream&, AlignmentBaseline);
+WTF::TextStream& operator<<(WTF::TextStream&, BaselineShift);
+WTF::TextStream& operator<<(WTF::TextStream&, BufferedRendering);
+WTF::TextStream& operator<<(WTF::TextStream&, ColorInterpolation);
+WTF::TextStream& operator<<(WTF::TextStream&, ColorRendering);
+WTF::TextStream& operator<<(WTF::TextStream&, DominantBaseline);
+WTF::TextStream& operator<<(WTF::TextStream&, GlyphOrientation);
+WTF::TextStream& operator<<(WTF::TextStream&, MaskType);
+WTF::TextStream& operator<<(WTF::TextStream&, SVGPaintType);
+WTF::TextStream& operator<<(WTF::TextStream&, ShapeRendering);
+WTF::TextStream& operator<<(WTF::TextStream&, TextAnchor);
+WTF::TextStream& operator<<(WTF::TextStream&, VectorEffect);
+
+WTF::TextStream& operator<<(WTF::TextStream&, const StyleFillData&);
+WTF::TextStream& operator<<(WTF::TextStream&, const StyleStrokeData&);
+WTF::TextStream& operator<<(WTF::TextStream&, const StyleStopData&);
+WTF::TextStream& operator<<(WTF::TextStream&, const StyleTextData&);
+WTF::TextStream& operator<<(WTF::TextStream&, const StyleMiscData&);
+WTF::TextStream& operator<<(WTF::TextStream&, const StyleShadowSVGData&);
+WTF::TextStream& operator<<(WTF::TextStream&, const StyleResourceData&);
+WTF::TextStream& operator<<(WTF::TextStream&, const StyleInheritedResourceData&);
+WTF::TextStream& operator<<(WTF::TextStream&, const StyleLayoutData&);
+
 } // namespace WebCore
diff --git a/Source/WebCore/rendering/style/ShadowData.cpp b/Source/WebCore/rendering/style/ShadowData.cpp
index c17eaf8..107276a 100644
--- a/Source/WebCore/rendering/style/ShadowData.cpp
+++ b/Source/WebCore/rendering/style/ShadowData.cpp
@@ -98,4 +98,14 @@
     rect.setHeight(rect.height() - shadowTop + shadowBottom);
 }
 
+TextStream& operator<<(TextStream& ts, const ShadowData& data)
+{
+    ts.dumpProperty("location", data.location());
+    ts.dumpProperty("radius", data.radius());
+    ts.dumpProperty("spread", data.spread());
+    ts.dumpProperty("color", data.color());
+
+    return ts;
+}
+
 } // namespace WebCore
diff --git a/Source/WebCore/rendering/style/ShadowData.h b/Source/WebCore/rendering/style/ShadowData.h
index 1d75f1e..0e0cdb7 100644
--- a/Source/WebCore/rendering/style/ShadowData.h
+++ b/Source/WebCore/rendering/style/ShadowData.h
@@ -99,4 +99,6 @@
     std::unique_ptr<ShadowData> m_next;
 };
 
+WTF::TextStream& operator<<(WTF::TextStream&, const ShadowData&);
+
 } // namespace WebCore