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 {