wpt/css/css-images/gradient/color-stops-parsing.html crashes
https://bugs.webkit.org/show_bug.cgi?id=200206

Reviewed by Carlos Alberto Lopez Perez.

LayoutTests/imported/w3c:

* web-platform-tests/css/css-images/gradient/color-stops-parsing-expected.txt:

Source/WebCore:

Share the code that writes color stops, and null-check the stop's m_color.

Tested by http/wpt/css/css-images/gradient/color-stops-parsing.html.

* css/CSSGradientValue.cpp:
(WebCore::CSSGradientValue::writeColorStop const):
(WebCore::CSSLinearGradientValue::customCSSText const):
(WebCore::CSSRadialGradientValue::customCSSText const):
(WebCore::CSSConicGradientValue::customCSSText const):
* css/CSSGradientValue.h:
(WebCore::CSSGradientValue::CSSGradientValue):

LayoutTests:

Unskip the test. It fails, but no longer crashes.

* TestExpectations:
* imported/w3c/web-platform-tests/css/css-images/gradient/color-stops-parsing-expected.txt: Added.
* platform/mac-highsierra/imported/w3c/web-platform-tests/css/css-images/gradient/color-stops-parsing-expected.txt: Added.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@251437 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index dab48f3..832c442 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,16 @@
+2019-10-21  Simon Fraser  <simon.fraser@apple.com>
+
+        wpt/css/css-images/gradient/color-stops-parsing.html crashes
+        https://bugs.webkit.org/show_bug.cgi?id=200206
+
+        Reviewed by Carlos Alberto Lopez Perez.
+
+        Unskip the test. It fails, but no longer crashes.
+
+        * TestExpectations:
+        * imported/w3c/web-platform-tests/css/css-images/gradient/color-stops-parsing-expected.txt: Added.
+        * platform/mac-highsierra/imported/w3c/web-platform-tests/css/css-images/gradient/color-stops-parsing-expected.txt: Added.
+
 2019-10-22  Alexey Proskuryakov  <ap@apple.com>
 
         Remove expectations for compositing/iframes/nested-iframe-scrolling.html.
diff --git a/LayoutTests/TestExpectations b/LayoutTests/TestExpectations
index d56d319..47173b7 100644
--- a/LayoutTests/TestExpectations
+++ b/LayoutTests/TestExpectations
@@ -3877,7 +3877,6 @@
 webkit.org/b/202801 imported/w3c/web-platform-tests/offscreen-canvas/shadows/2d.shadow.pattern.transparent.2.html [ DumpJSConsoleLogInStdErr ]
 
 # wpt css-images failures
-webkit.org/b/200206 imported/w3c/web-platform-tests/css/css-images/gradient/color-stops-parsing.html [ Crash ]
 webkit.org/b/200207 imported/w3c/web-platform-tests/css/css-images/css-image-fallbacks-and-annotations002.html [ ImageOnlyFailure ]
 webkit.org/b/200207 imported/w3c/web-platform-tests/css/css-images/css-image-fallbacks-and-annotations003.html [ ImageOnlyFailure ]
 webkit.org/b/200207 imported/w3c/web-platform-tests/css/css-images/css-image-fallbacks-and-annotations004.html [ ImageOnlyFailure ]
diff --git a/LayoutTests/imported/w3c/ChangeLog b/LayoutTests/imported/w3c/ChangeLog
index f396b8f..5a133585 100644
--- a/LayoutTests/imported/w3c/ChangeLog
+++ b/LayoutTests/imported/w3c/ChangeLog
@@ -1,3 +1,12 @@
+2019-10-21  Simon Fraser  <simon.fraser@apple.com>
+
+        wpt/css/css-images/gradient/color-stops-parsing.html crashes
+        https://bugs.webkit.org/show_bug.cgi?id=200206
+
+        Reviewed by Carlos Alberto Lopez Perez.
+
+        * web-platform-tests/css/css-images/gradient/color-stops-parsing-expected.txt:
+
 2019-10-21  Yusuke Suzuki  <ysuzuki@apple.com>
 
         [JSC] Thread JSGlobalObject* instead of ExecState*
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/gradient/color-stops-parsing-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/gradient/color-stops-parsing-expected.txt
index e69de29..2ebec3e 100644
--- a/LayoutTests/imported/w3c/web-platform-tests/css/css-images/gradient/color-stops-parsing-expected.txt
+++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-images/gradient/color-stops-parsing-expected.txt
@@ -0,0 +1,158 @@
+
+PASS linear-gradient() [ unparsable ] 
+PASS linear-gradient(black) [ unparsable ] 
+PASS linear-gradient(black 0%) [ unparsable ] 
+PASS linear-gradient(black, 25%) [ unparsable ] 
+PASS linear-gradient(black, invalid) [ unparsable ] 
+PASS linear-gradient(black, , white) [ unparsable ] 
+PASS linear-gradient(black, white, 75%) [ unparsable ] 
+FAIL linear-gradient(black, 25% 50%, white) [ unparsable ] assert_equals: expected false but got true
+PASS linear-gradient(black, 25%, 50%, white) [ unparsable ] 
+PASS linear-gradient(black 10% 25% 50%, white) [ unparsable ] 
+PASS linear-gradient(,black, white) [ unparsable ] 
+PASS linear-gradient(0%, black, white) [ unparsable ] 
+PASS linear-gradient(black, white) [ parsable ] 
+PASS linear-gradient(black 0, white) [ parsable ] 
+PASS linear-gradient(black 0%, white) [ parsable ] 
+PASS linear-gradient(black 0%, white 100%) [ parsable ] 
+PASS linear-gradient(black, green, white) [ parsable ] 
+PASS linear-gradient(black 0%, green 50%, white 100%) [ parsable ] 
+PASS linear-gradient(black 50%, green 10%, white 100%) [ parsable ] 
+PASS linear-gradient(black, 25%, white) [ parsable ] 
+PASS linear-gradient(black 0%, 25%, white 100%) [ parsable ] 
+PASS linear-gradient(black 0%, 15%, green 50%, 60%, white 100%) [ parsable ] 
+PASS linear-gradient(black 0% 50%, white) [ parsable ] 
+PASS linear-gradient(black 0% 50%, white 50% 100%) [ parsable ] 
+PASS linear-gradient(black 0% 50%, green 25% 75%, white 50% 100%) [ parsable ] 
+PASS linear-gradient(black 0% calc(100% / 5), 25%, green 30% 60%, calc(100% * 3 / 4), white calc(100% - 20%) 100%) [ parsable ] 
+PASS repeating-linear-gradient() [ unparsable ] 
+PASS repeating-linear-gradient(black) [ unparsable ] 
+PASS repeating-linear-gradient(black 0%) [ unparsable ] 
+PASS repeating-linear-gradient(black, 25%) [ unparsable ] 
+PASS repeating-linear-gradient(black, invalid) [ unparsable ] 
+PASS repeating-linear-gradient(black, , white) [ unparsable ] 
+PASS repeating-linear-gradient(black, white, 75%) [ unparsable ] 
+FAIL repeating-linear-gradient(black, 25% 50%, white) [ unparsable ] assert_equals: expected false but got true
+PASS repeating-linear-gradient(black, 25%, 50%, white) [ unparsable ] 
+PASS repeating-linear-gradient(black 10% 25% 50%, white) [ unparsable ] 
+PASS repeating-linear-gradient(,black, white) [ unparsable ] 
+PASS repeating-linear-gradient(0%, black, white) [ unparsable ] 
+PASS repeating-linear-gradient(black, white) [ parsable ] 
+PASS repeating-linear-gradient(black 0, white) [ parsable ] 
+PASS repeating-linear-gradient(black 0%, white) [ parsable ] 
+PASS repeating-linear-gradient(black 0%, white 100%) [ parsable ] 
+PASS repeating-linear-gradient(black, green, white) [ parsable ] 
+PASS repeating-linear-gradient(black 0%, green 50%, white 100%) [ parsable ] 
+PASS repeating-linear-gradient(black 50%, green 10%, white 100%) [ parsable ] 
+PASS repeating-linear-gradient(black, 25%, white) [ parsable ] 
+PASS repeating-linear-gradient(black 0%, 25%, white 100%) [ parsable ] 
+PASS repeating-linear-gradient(black 0%, 15%, green 50%, 60%, white 100%) [ parsable ] 
+PASS repeating-linear-gradient(black 0% 50%, white) [ parsable ] 
+PASS repeating-linear-gradient(black 0% 50%, white 50% 100%) [ parsable ] 
+PASS repeating-linear-gradient(black 0% 50%, green 25% 75%, white 50% 100%) [ parsable ] 
+PASS repeating-linear-gradient(black 0% calc(100% / 5), 25%, green 30% 60%, calc(100% * 3 / 4), white calc(100% - 20%) 100%) [ parsable ] 
+PASS radial-gradient() [ unparsable ] 
+PASS radial-gradient(black) [ unparsable ] 
+PASS radial-gradient(black 0%) [ unparsable ] 
+PASS radial-gradient(black, 25%) [ unparsable ] 
+PASS radial-gradient(black, invalid) [ unparsable ] 
+PASS radial-gradient(black, , white) [ unparsable ] 
+PASS radial-gradient(black, white, 75%) [ unparsable ] 
+FAIL radial-gradient(black, 25% 50%, white) [ unparsable ] assert_equals: expected false but got true
+PASS radial-gradient(black, 25%, 50%, white) [ unparsable ] 
+PASS radial-gradient(black 10% 25% 50%, white) [ unparsable ] 
+PASS radial-gradient(,black, white) [ unparsable ] 
+PASS radial-gradient(0%, black, white) [ unparsable ] 
+PASS radial-gradient(black, white) [ parsable ] 
+PASS radial-gradient(black 0, white) [ parsable ] 
+PASS radial-gradient(black 0%, white) [ parsable ] 
+PASS radial-gradient(black 0%, white 100%) [ parsable ] 
+PASS radial-gradient(black, green, white) [ parsable ] 
+PASS radial-gradient(black 0%, green 50%, white 100%) [ parsable ] 
+PASS radial-gradient(black 50%, green 10%, white 100%) [ parsable ] 
+PASS radial-gradient(black, 25%, white) [ parsable ] 
+PASS radial-gradient(black 0%, 25%, white 100%) [ parsable ] 
+PASS radial-gradient(black 0%, 15%, green 50%, 60%, white 100%) [ parsable ] 
+PASS radial-gradient(black 0% 50%, white) [ parsable ] 
+PASS radial-gradient(black 0% 50%, white 50% 100%) [ parsable ] 
+PASS radial-gradient(black 0% 50%, green 25% 75%, white 50% 100%) [ parsable ] 
+PASS radial-gradient(black 0% calc(100% / 5), 25%, green 30% 60%, calc(100% * 3 / 4), white calc(100% - 20%) 100%) [ parsable ] 
+PASS repeating-radial-gradient() [ unparsable ] 
+PASS repeating-radial-gradient(black) [ unparsable ] 
+PASS repeating-radial-gradient(black 0%) [ unparsable ] 
+PASS repeating-radial-gradient(black, 25%) [ unparsable ] 
+PASS repeating-radial-gradient(black, invalid) [ unparsable ] 
+PASS repeating-radial-gradient(black, , white) [ unparsable ] 
+PASS repeating-radial-gradient(black, white, 75%) [ unparsable ] 
+FAIL repeating-radial-gradient(black, 25% 50%, white) [ unparsable ] assert_equals: expected false but got true
+PASS repeating-radial-gradient(black, 25%, 50%, white) [ unparsable ] 
+PASS repeating-radial-gradient(black 10% 25% 50%, white) [ unparsable ] 
+PASS repeating-radial-gradient(,black, white) [ unparsable ] 
+PASS repeating-radial-gradient(0%, black, white) [ unparsable ] 
+PASS repeating-radial-gradient(black, white) [ parsable ] 
+PASS repeating-radial-gradient(black 0, white) [ parsable ] 
+PASS repeating-radial-gradient(black 0%, white) [ parsable ] 
+PASS repeating-radial-gradient(black 0%, white 100%) [ parsable ] 
+PASS repeating-radial-gradient(black, green, white) [ parsable ] 
+PASS repeating-radial-gradient(black 0%, green 50%, white 100%) [ parsable ] 
+PASS repeating-radial-gradient(black 50%, green 10%, white 100%) [ parsable ] 
+PASS repeating-radial-gradient(black, 25%, white) [ parsable ] 
+PASS repeating-radial-gradient(black 0%, 25%, white 100%) [ parsable ] 
+PASS repeating-radial-gradient(black 0%, 15%, green 50%, 60%, white 100%) [ parsable ] 
+PASS repeating-radial-gradient(black 0% 50%, white) [ parsable ] 
+PASS repeating-radial-gradient(black 0% 50%, white 50% 100%) [ parsable ] 
+PASS repeating-radial-gradient(black 0% 50%, green 25% 75%, white 50% 100%) [ parsable ] 
+PASS repeating-radial-gradient(black 0% calc(100% / 5), 25%, green 30% 60%, calc(100% * 3 / 4), white calc(100% - 20%) 100%) [ parsable ] 
+PASS conic-gradient() [ unparsable ] 
+PASS conic-gradient(black) [ unparsable ] 
+PASS conic-gradient(black 0%) [ unparsable ] 
+PASS conic-gradient(black, 25%) [ unparsable ] 
+PASS conic-gradient(black, invalid) [ unparsable ] 
+PASS conic-gradient(black, , white) [ unparsable ] 
+PASS conic-gradient(black, white, 75%) [ unparsable ] 
+FAIL conic-gradient(black, 25% 50%, white) [ unparsable ] assert_equals: expected false but got true
+PASS conic-gradient(black, 25%, 50%, white) [ unparsable ] 
+PASS conic-gradient(black 10% 25% 50%, white) [ unparsable ] 
+PASS conic-gradient(,black, white) [ unparsable ] 
+PASS conic-gradient(0%, black, white) [ unparsable ] 
+PASS conic-gradient(black, white) [ parsable ] 
+PASS conic-gradient(black 0, white) [ parsable ] 
+PASS conic-gradient(black 0%, white) [ parsable ] 
+PASS conic-gradient(black 0%, white 100%) [ parsable ] 
+PASS conic-gradient(black, green, white) [ parsable ] 
+PASS conic-gradient(black 0%, green 50%, white 100%) [ parsable ] 
+PASS conic-gradient(black 50%, green 10%, white 100%) [ parsable ] 
+PASS conic-gradient(black, 25%, white) [ parsable ] 
+PASS conic-gradient(black 0%, 25%, white 100%) [ parsable ] 
+PASS conic-gradient(black 0%, 15%, green 50%, 60%, white 100%) [ parsable ] 
+PASS conic-gradient(black 0% 50%, white) [ parsable ] 
+PASS conic-gradient(black 0% 50%, white 50% 100%) [ parsable ] 
+PASS conic-gradient(black 0% 50%, green 25% 75%, white 50% 100%) [ parsable ] 
+PASS conic-gradient(black 0% calc(100% / 5), 25%, green 30% 60%, calc(100% * 3 / 4), white calc(100% - 20%) 100%) [ parsable ] 
+PASS repeating-conic-gradient() [ unparsable ] 
+PASS repeating-conic-gradient(black) [ unparsable ] 
+PASS repeating-conic-gradient(black 0%) [ unparsable ] 
+PASS repeating-conic-gradient(black, 25%) [ unparsable ] 
+PASS repeating-conic-gradient(black, invalid) [ unparsable ] 
+PASS repeating-conic-gradient(black, , white) [ unparsable ] 
+PASS repeating-conic-gradient(black, white, 75%) [ unparsable ] 
+FAIL repeating-conic-gradient(black, 25% 50%, white) [ unparsable ] assert_equals: expected false but got true
+PASS repeating-conic-gradient(black, 25%, 50%, white) [ unparsable ] 
+PASS repeating-conic-gradient(black 10% 25% 50%, white) [ unparsable ] 
+PASS repeating-conic-gradient(,black, white) [ unparsable ] 
+PASS repeating-conic-gradient(0%, black, white) [ unparsable ] 
+PASS repeating-conic-gradient(black, white) [ parsable ] 
+PASS repeating-conic-gradient(black 0, white) [ parsable ] 
+PASS repeating-conic-gradient(black 0%, white) [ parsable ] 
+PASS repeating-conic-gradient(black 0%, white 100%) [ parsable ] 
+PASS repeating-conic-gradient(black, green, white) [ parsable ] 
+PASS repeating-conic-gradient(black 0%, green 50%, white 100%) [ parsable ] 
+PASS repeating-conic-gradient(black 50%, green 10%, white 100%) [ parsable ] 
+PASS repeating-conic-gradient(black, 25%, white) [ parsable ] 
+PASS repeating-conic-gradient(black 0%, 25%, white 100%) [ parsable ] 
+PASS repeating-conic-gradient(black 0%, 15%, green 50%, 60%, white 100%) [ parsable ] 
+PASS repeating-conic-gradient(black 0% 50%, white) [ parsable ] 
+PASS repeating-conic-gradient(black 0% 50%, white 50% 100%) [ parsable ] 
+PASS repeating-conic-gradient(black 0% 50%, green 25% 75%, white 50% 100%) [ parsable ] 
+PASS repeating-conic-gradient(black 0% calc(100% / 5), 25%, green 30% 60%, calc(100% * 3 / 4), white calc(100% - 20%) 100%) [ parsable ] 
+
diff --git a/LayoutTests/platform/mac-highsierra/imported/w3c/web-platform-tests/css/css-images/gradient/color-stops-parsing-expected.txt b/LayoutTests/platform/mac-highsierra/imported/w3c/web-platform-tests/css/css-images/gradient/color-stops-parsing-expected.txt
new file mode 100644
index 0000000..7149731
--- /dev/null
+++ b/LayoutTests/platform/mac-highsierra/imported/w3c/web-platform-tests/css/css-images/gradient/color-stops-parsing-expected.txt
@@ -0,0 +1,158 @@
+
+PASS linear-gradient() [ unparsable ] 
+PASS linear-gradient(black) [ unparsable ] 
+PASS linear-gradient(black 0%) [ unparsable ] 
+PASS linear-gradient(black, 25%) [ unparsable ] 
+PASS linear-gradient(black, invalid) [ unparsable ] 
+PASS linear-gradient(black, , white) [ unparsable ] 
+PASS linear-gradient(black, white, 75%) [ unparsable ] 
+FAIL linear-gradient(black, 25% 50%, white) [ unparsable ] assert_equals: expected false but got true
+PASS linear-gradient(black, 25%, 50%, white) [ unparsable ] 
+PASS linear-gradient(black 10% 25% 50%, white) [ unparsable ] 
+PASS linear-gradient(,black, white) [ unparsable ] 
+PASS linear-gradient(0%, black, white) [ unparsable ] 
+PASS linear-gradient(black, white) [ parsable ] 
+PASS linear-gradient(black 0, white) [ parsable ] 
+PASS linear-gradient(black 0%, white) [ parsable ] 
+PASS linear-gradient(black 0%, white 100%) [ parsable ] 
+PASS linear-gradient(black, green, white) [ parsable ] 
+PASS linear-gradient(black 0%, green 50%, white 100%) [ parsable ] 
+PASS linear-gradient(black 50%, green 10%, white 100%) [ parsable ] 
+PASS linear-gradient(black, 25%, white) [ parsable ] 
+PASS linear-gradient(black 0%, 25%, white 100%) [ parsable ] 
+PASS linear-gradient(black 0%, 15%, green 50%, 60%, white 100%) [ parsable ] 
+PASS linear-gradient(black 0% 50%, white) [ parsable ] 
+PASS linear-gradient(black 0% 50%, white 50% 100%) [ parsable ] 
+PASS linear-gradient(black 0% 50%, green 25% 75%, white 50% 100%) [ parsable ] 
+PASS linear-gradient(black 0% calc(100% / 5), 25%, green 30% 60%, calc(100% * 3 / 4), white calc(100% - 20%) 100%) [ parsable ] 
+PASS repeating-linear-gradient() [ unparsable ] 
+PASS repeating-linear-gradient(black) [ unparsable ] 
+PASS repeating-linear-gradient(black 0%) [ unparsable ] 
+PASS repeating-linear-gradient(black, 25%) [ unparsable ] 
+PASS repeating-linear-gradient(black, invalid) [ unparsable ] 
+PASS repeating-linear-gradient(black, , white) [ unparsable ] 
+PASS repeating-linear-gradient(black, white, 75%) [ unparsable ] 
+FAIL repeating-linear-gradient(black, 25% 50%, white) [ unparsable ] assert_equals: expected false but got true
+PASS repeating-linear-gradient(black, 25%, 50%, white) [ unparsable ] 
+PASS repeating-linear-gradient(black 10% 25% 50%, white) [ unparsable ] 
+PASS repeating-linear-gradient(,black, white) [ unparsable ] 
+PASS repeating-linear-gradient(0%, black, white) [ unparsable ] 
+PASS repeating-linear-gradient(black, white) [ parsable ] 
+PASS repeating-linear-gradient(black 0, white) [ parsable ] 
+PASS repeating-linear-gradient(black 0%, white) [ parsable ] 
+PASS repeating-linear-gradient(black 0%, white 100%) [ parsable ] 
+PASS repeating-linear-gradient(black, green, white) [ parsable ] 
+PASS repeating-linear-gradient(black 0%, green 50%, white 100%) [ parsable ] 
+PASS repeating-linear-gradient(black 50%, green 10%, white 100%) [ parsable ] 
+PASS repeating-linear-gradient(black, 25%, white) [ parsable ] 
+PASS repeating-linear-gradient(black 0%, 25%, white 100%) [ parsable ] 
+PASS repeating-linear-gradient(black 0%, 15%, green 50%, 60%, white 100%) [ parsable ] 
+PASS repeating-linear-gradient(black 0% 50%, white) [ parsable ] 
+PASS repeating-linear-gradient(black 0% 50%, white 50% 100%) [ parsable ] 
+PASS repeating-linear-gradient(black 0% 50%, green 25% 75%, white 50% 100%) [ parsable ] 
+PASS repeating-linear-gradient(black 0% calc(100% / 5), 25%, green 30% 60%, calc(100% * 3 / 4), white calc(100% - 20%) 100%) [ parsable ] 
+PASS radial-gradient() [ unparsable ] 
+PASS radial-gradient(black) [ unparsable ] 
+PASS radial-gradient(black 0%) [ unparsable ] 
+PASS radial-gradient(black, 25%) [ unparsable ] 
+PASS radial-gradient(black, invalid) [ unparsable ] 
+PASS radial-gradient(black, , white) [ unparsable ] 
+PASS radial-gradient(black, white, 75%) [ unparsable ] 
+FAIL radial-gradient(black, 25% 50%, white) [ unparsable ] assert_equals: expected false but got true
+PASS radial-gradient(black, 25%, 50%, white) [ unparsable ] 
+PASS radial-gradient(black 10% 25% 50%, white) [ unparsable ] 
+PASS radial-gradient(,black, white) [ unparsable ] 
+PASS radial-gradient(0%, black, white) [ unparsable ] 
+PASS radial-gradient(black, white) [ parsable ] 
+PASS radial-gradient(black 0, white) [ parsable ] 
+PASS radial-gradient(black 0%, white) [ parsable ] 
+PASS radial-gradient(black 0%, white 100%) [ parsable ] 
+PASS radial-gradient(black, green, white) [ parsable ] 
+PASS radial-gradient(black 0%, green 50%, white 100%) [ parsable ] 
+PASS radial-gradient(black 50%, green 10%, white 100%) [ parsable ] 
+PASS radial-gradient(black, 25%, white) [ parsable ] 
+PASS radial-gradient(black 0%, 25%, white 100%) [ parsable ] 
+PASS radial-gradient(black 0%, 15%, green 50%, 60%, white 100%) [ parsable ] 
+PASS radial-gradient(black 0% 50%, white) [ parsable ] 
+PASS radial-gradient(black 0% 50%, white 50% 100%) [ parsable ] 
+PASS radial-gradient(black 0% 50%, green 25% 75%, white 50% 100%) [ parsable ] 
+PASS radial-gradient(black 0% calc(100% / 5), 25%, green 30% 60%, calc(100% * 3 / 4), white calc(100% - 20%) 100%) [ parsable ] 
+PASS repeating-radial-gradient() [ unparsable ] 
+PASS repeating-radial-gradient(black) [ unparsable ] 
+PASS repeating-radial-gradient(black 0%) [ unparsable ] 
+PASS repeating-radial-gradient(black, 25%) [ unparsable ] 
+PASS repeating-radial-gradient(black, invalid) [ unparsable ] 
+PASS repeating-radial-gradient(black, , white) [ unparsable ] 
+PASS repeating-radial-gradient(black, white, 75%) [ unparsable ] 
+FAIL repeating-radial-gradient(black, 25% 50%, white) [ unparsable ] assert_equals: expected false but got true
+PASS repeating-radial-gradient(black, 25%, 50%, white) [ unparsable ] 
+PASS repeating-radial-gradient(black 10% 25% 50%, white) [ unparsable ] 
+PASS repeating-radial-gradient(,black, white) [ unparsable ] 
+PASS repeating-radial-gradient(0%, black, white) [ unparsable ] 
+PASS repeating-radial-gradient(black, white) [ parsable ] 
+PASS repeating-radial-gradient(black 0, white) [ parsable ] 
+PASS repeating-radial-gradient(black 0%, white) [ parsable ] 
+PASS repeating-radial-gradient(black 0%, white 100%) [ parsable ] 
+PASS repeating-radial-gradient(black, green, white) [ parsable ] 
+PASS repeating-radial-gradient(black 0%, green 50%, white 100%) [ parsable ] 
+PASS repeating-radial-gradient(black 50%, green 10%, white 100%) [ parsable ] 
+PASS repeating-radial-gradient(black, 25%, white) [ parsable ] 
+PASS repeating-radial-gradient(black 0%, 25%, white 100%) [ parsable ] 
+PASS repeating-radial-gradient(black 0%, 15%, green 50%, 60%, white 100%) [ parsable ] 
+PASS repeating-radial-gradient(black 0% 50%, white) [ parsable ] 
+PASS repeating-radial-gradient(black 0% 50%, white 50% 100%) [ parsable ] 
+PASS repeating-radial-gradient(black 0% 50%, green 25% 75%, white 50% 100%) [ parsable ] 
+PASS repeating-radial-gradient(black 0% calc(100% / 5), 25%, green 30% 60%, calc(100% * 3 / 4), white calc(100% - 20%) 100%) [ parsable ] 
+PASS conic-gradient() [ unparsable ] 
+PASS conic-gradient(black) [ unparsable ] 
+PASS conic-gradient(black 0%) [ unparsable ] 
+PASS conic-gradient(black, 25%) [ unparsable ] 
+PASS conic-gradient(black, invalid) [ unparsable ] 
+PASS conic-gradient(black, , white) [ unparsable ] 
+PASS conic-gradient(black, white, 75%) [ unparsable ] 
+PASS conic-gradient(black, 25% 50%, white) [ unparsable ] 
+PASS conic-gradient(black, 25%, 50%, white) [ unparsable ] 
+PASS conic-gradient(black 10% 25% 50%, white) [ unparsable ] 
+PASS conic-gradient(,black, white) [ unparsable ] 
+PASS conic-gradient(0%, black, white) [ unparsable ] 
+FAIL conic-gradient(black, white) [ parsable ] assert_equals: expected true but got false
+FAIL conic-gradient(black 0, white) [ parsable ] assert_equals: expected true but got false
+FAIL conic-gradient(black 0%, white) [ parsable ] assert_equals: expected true but got false
+FAIL conic-gradient(black 0%, white 100%) [ parsable ] assert_equals: expected true but got false
+FAIL conic-gradient(black, green, white) [ parsable ] assert_equals: expected true but got false
+FAIL conic-gradient(black 0%, green 50%, white 100%) [ parsable ] assert_equals: expected true but got false
+FAIL conic-gradient(black 50%, green 10%, white 100%) [ parsable ] assert_equals: expected true but got false
+FAIL conic-gradient(black, 25%, white) [ parsable ] assert_equals: expected true but got false
+FAIL conic-gradient(black 0%, 25%, white 100%) [ parsable ] assert_equals: expected true but got false
+FAIL conic-gradient(black 0%, 15%, green 50%, 60%, white 100%) [ parsable ] assert_equals: expected true but got false
+FAIL conic-gradient(black 0% 50%, white) [ parsable ] assert_equals: expected true but got false
+FAIL conic-gradient(black 0% 50%, white 50% 100%) [ parsable ] assert_equals: expected true but got false
+FAIL conic-gradient(black 0% 50%, green 25% 75%, white 50% 100%) [ parsable ] assert_equals: expected true but got false
+FAIL conic-gradient(black 0% calc(100% / 5), 25%, green 30% 60%, calc(100% * 3 / 4), white calc(100% - 20%) 100%) [ parsable ] assert_equals: expected true but got false
+PASS repeating-conic-gradient() [ unparsable ] 
+PASS repeating-conic-gradient(black) [ unparsable ] 
+PASS repeating-conic-gradient(black 0%) [ unparsable ] 
+PASS repeating-conic-gradient(black, 25%) [ unparsable ] 
+PASS repeating-conic-gradient(black, invalid) [ unparsable ] 
+PASS repeating-conic-gradient(black, , white) [ unparsable ] 
+PASS repeating-conic-gradient(black, white, 75%) [ unparsable ] 
+PASS repeating-conic-gradient(black, 25% 50%, white) [ unparsable ] 
+PASS repeating-conic-gradient(black, 25%, 50%, white) [ unparsable ] 
+PASS repeating-conic-gradient(black 10% 25% 50%, white) [ unparsable ] 
+PASS repeating-conic-gradient(,black, white) [ unparsable ] 
+PASS repeating-conic-gradient(0%, black, white) [ unparsable ] 
+FAIL repeating-conic-gradient(black, white) [ parsable ] assert_equals: expected true but got false
+FAIL repeating-conic-gradient(black 0, white) [ parsable ] assert_equals: expected true but got false
+FAIL repeating-conic-gradient(black 0%, white) [ parsable ] assert_equals: expected true but got false
+FAIL repeating-conic-gradient(black 0%, white 100%) [ parsable ] assert_equals: expected true but got false
+FAIL repeating-conic-gradient(black, green, white) [ parsable ] assert_equals: expected true but got false
+FAIL repeating-conic-gradient(black 0%, green 50%, white 100%) [ parsable ] assert_equals: expected true but got false
+FAIL repeating-conic-gradient(black 50%, green 10%, white 100%) [ parsable ] assert_equals: expected true but got false
+FAIL repeating-conic-gradient(black, 25%, white) [ parsable ] assert_equals: expected true but got false
+FAIL repeating-conic-gradient(black 0%, 25%, white 100%) [ parsable ] assert_equals: expected true but got false
+FAIL repeating-conic-gradient(black 0%, 15%, green 50%, 60%, white 100%) [ parsable ] assert_equals: expected true but got false
+FAIL repeating-conic-gradient(black 0% 50%, white) [ parsable ] assert_equals: expected true but got false
+FAIL repeating-conic-gradient(black 0% 50%, white 50% 100%) [ parsable ] assert_equals: expected true but got false
+FAIL repeating-conic-gradient(black 0% 50%, green 25% 75%, white 50% 100%) [ parsable ] assert_equals: expected true but got false
+FAIL repeating-conic-gradient(black 0% calc(100% / 5), 25%, green 30% 60%, calc(100% * 3 / 4), white calc(100% - 20%) 100%) [ parsable ] assert_equals: expected true but got false
+
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 33b70d6..a1f354a 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,22 @@
+2019-10-21  Simon Fraser  <simon.fraser@apple.com>
+
+        wpt/css/css-images/gradient/color-stops-parsing.html crashes
+        https://bugs.webkit.org/show_bug.cgi?id=200206
+
+        Reviewed by Carlos Alberto Lopez Perez.
+
+        Share the code that writes color stops, and null-check the stop's m_color.
+
+        Tested by http/wpt/css/css-images/gradient/color-stops-parsing.html.
+
+        * css/CSSGradientValue.cpp:
+        (WebCore::CSSGradientValue::writeColorStop const):
+        (WebCore::CSSLinearGradientValue::customCSSText const):
+        (WebCore::CSSRadialGradientValue::customCSSText const):
+        (WebCore::CSSConicGradientValue::customCSSText const):
+        * css/CSSGradientValue.h:
+        (WebCore::CSSGradientValue::CSSGradientValue):
+
 2019-10-22  Adrian Perez de Castro  <aperez@igalia.com>
 
         [GTK][WPE] Fix non-unified builds after r251326
diff --git a/Source/WebCore/css/CSSGradientValue.cpp b/Source/WebCore/css/CSSGradientValue.cpp
index 705c48f..5e3f4e7 100644
--- a/Source/WebCore/css/CSSGradientValue.cpp
+++ b/Source/WebCore/css/CSSGradientValue.cpp
@@ -679,6 +679,18 @@
     }
 }
 
+void CSSGradientValue::writeColorStop(StringBuilder& builder, const CSSGradientColorStop& stop) const
+{
+    if (!stop.isMidpoint && stop.m_color)
+        builder.append(stop.m_color->cssText());
+
+    if (stop.m_position) {
+        if (!stop.isMidpoint)
+            builder.append(' ');
+        builder.append(stop.m_position->cssText());
+    }
+}
+
 String CSSLinearGradientValue::customCSSText() const
 {
     StringBuilder result;
@@ -703,9 +715,8 @@
         }
 
         for (auto& stop : m_stops) {
-            result.append(", ", stop.m_color->cssText());
-            if (stop.m_position)
-                result.append(' ', stop.m_position->cssText());
+            result.appendLiteral(", ");
+            writeColorStop(result, stop);
         }
     } else {
         if (m_repeating)
@@ -737,13 +748,7 @@
             if (wroteFirstStop)
                 result.appendLiteral(", ");
             wroteFirstStop = true;
-            if (!stop.isMidpoint)
-                result.append(stop.m_color->cssText());
-            if (stop.m_position) {
-                if (!stop.isMidpoint)
-                    result.append(' ');
-                result.append(stop.m_position->cssText());
-            }
+            writeColorStop(result, stop);
         }
     }
 
@@ -954,9 +959,8 @@
             result.append(", ", m_endHorizontalSize->cssText(), ' ', m_endVerticalSize->cssText());
 
         for (auto& stop : m_stops) {
-            result.append(", ", stop.m_color->cssText());
-            if (stop.m_position)
-                result.append(' ', stop.m_position->cssText());
+            result.appendLiteral(", ");
+            writeColorStop(result, stop);
         }
     } else {
         if (m_repeating)
@@ -1003,19 +1007,13 @@
         if (wroteSomething)
             result.appendLiteral(", ");
 
-        for (unsigned i = 0; i < m_stops.size(); i++) {
-            const CSSGradientColorStop& stop = m_stops[i];
-            if (i)
+        bool wroteFirstStop = false;
+        for (auto& stop : m_stops) {
+            if (wroteFirstStop)
                 result.appendLiteral(", ");
-            if (!stop.isMidpoint)
-                result.append(stop.m_color->cssText());
-            if (stop.m_position) {
-                if (!stop.isMidpoint)
-                    result.append(' ');
-                result.append(stop.m_position->cssText());
-            }
+            wroteFirstStop = true;
+            writeColorStop(result, stop);
         }
-
     }
 
     result.append(')');
@@ -1332,15 +1330,9 @@
         if (wroteFirstStop)
             result.appendLiteral(", ");
         wroteFirstStop = true;
-        if (!stop.isMidpoint)
-            result.append(stop.m_color->cssText());
-        if (stop.m_position) {
-            if (!stop.isMidpoint)
-                result.append(' ');
-            result.append(stop.m_position->cssText());
-        }
+        writeColorStop(result, stop);
     }
-    
+
     result.append(')');
     return result.toString();
 }
diff --git a/Source/WebCore/css/CSSGradientValue.h b/Source/WebCore/css/CSSGradientValue.h
index 7697b74..0b6cea7 100644
--- a/Source/WebCore/css/CSSGradientValue.h
+++ b/Source/WebCore/css/CSSGradientValue.h
@@ -91,7 +91,6 @@
 protected:
     CSSGradientValue(ClassType classType, CSSGradientRepeat repeat, CSSGradientType gradientType)
         : CSSImageGeneratorValue(classType)
-        , m_stopsSorted(false)
         , m_gradientType(gradientType)
         , m_repeating(repeat == Repeating)
     {
@@ -106,7 +105,7 @@
         , m_stops(other.m_stops)
         , m_stopsSorted(other.m_stopsSorted)
         , m_gradientType(gradientType)
-        , m_repeating(other.isRepeating() ? Repeating : NonRepeating)
+        , m_repeating(other.m_repeating)
     {
     }
 
@@ -117,6 +116,8 @@
     FloatPoint computeEndPoint(CSSPrimitiveValue*, CSSPrimitiveValue*, const CSSToLengthConversionData&, const FloatSize&);
 
     bool isCacheable() const;
+    
+    void writeColorStop(StringBuilder&, const CSSGradientColorStop&) const;
 
     // Points. Some of these may be null.
     RefPtr<CSSPrimitiveValue> m_firstX;
@@ -127,9 +128,9 @@
 
     // Stops
     Vector<CSSGradientColorStop, 2> m_stops;
-    bool m_stopsSorted;
+    bool m_stopsSorted { false };
     CSSGradientType m_gradientType;
-    bool m_repeating;
+    bool m_repeating { false };
 };
 
 class CSSLinearGradientValue final : public CSSGradientValue {