Make color-filter affect caret-color
https://bugs.webkit.org/show_bug.cgi?id=185129
rdar://problem/39829066

Reviewed by Tim Horton.
Source/WebCore:

Transform the colors used to compare the caret color with the background through
color-filter (since we want contrasting colors after filters are applied), and
transform caret-color itself.

Test: css3/color-filters/color-filter-caret-color.html

* editing/FrameSelection.cpp:
(WebCore::CaretBase::paintCaret const):

LayoutTests:

* css3/color-filters/color-filter-caret-color-expected.html: Added.
* css3/color-filters/color-filter-caret-color.html: Added.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@231159 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 7534cf5..e2a2a49 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,14 @@
+2018-04-30  Simon Fraser  <simon.fraser@apple.com>
+
+        Make color-filter affect caret-color
+        https://bugs.webkit.org/show_bug.cgi?id=185129
+        rdar://problem/39829066
+
+        Reviewed by Tim Horton.
+
+        * css3/color-filters/color-filter-caret-color-expected.html: Added.
+        * css3/color-filters/color-filter-caret-color.html: Added.
+
 2018-04-28  Simon Fraser  <simon.fraser@apple.com>
 
         Fix color-filter to apply to SVG colors
diff --git a/LayoutTests/css3/color-filters/color-filter-caret-color-expected.html b/LayoutTests/css3/color-filters/color-filter-caret-color-expected.html
new file mode 100644
index 0000000..4dd384b
--- /dev/null
+++ b/LayoutTests/css3/color-filters/color-filter-caret-color-expected.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>CSS Test: color-filter reference</title>
+        <link rel="author" title="Apple" href="http://www.apple.com/">
+
+        <style>
+        #test-container {
+            height: 50px;
+            width: 50px;
+            overflow: hidden;
+            border: 1px solid black;
+        }
+
+        #test {
+            background-color: white;
+            transform-origin: left top;
+            transform: scale(50, 50);
+            font-size: 10px; /* Needed for the caret to render in Firefox. */
+            caret-color: green;
+        }
+
+        </style>
+    </head>
+    <body>
+        <p>The caret should show as a green flashing square below.</p>
+        <div id="test-container">
+            <div id="test" contenteditable="true">
+                <span>&nbsp;<!-- Needed for the caret to render in Firefox. --></span>
+            </div>
+        </div>
+        <script>
+            document.getElementById("test").focus();
+            window.getSelection().modify("move", "left", "character"); // Place the caret at the start of the <span>.
+        </script>
+    </body>
+</html>
diff --git a/LayoutTests/css3/color-filters/color-filter-caret-color.html b/LayoutTests/css3/color-filters/color-filter-caret-color.html
new file mode 100644
index 0000000..f814dd6
--- /dev/null
+++ b/LayoutTests/css3/color-filters/color-filter-caret-color.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>CSS Test: color-filter affects caret-color</title>
+        <link rel="author" title="Apple" href="http://www.apple.com/">
+        <link rel="match" href="color-filter-caret-color-expected.html">
+
+        <meta name="assert" content="color-filter affects caret-color">
+        <style>
+        #test-container {
+            height: 50px;
+            width: 50px;
+            overflow: hidden;
+            border: 1px solid black;
+        }
+
+        #test {
+            color-filter: invert();
+            background-color: white;
+            transform-origin: left top;
+            transform: scale(50, 50);
+            font-size: 10px; /* Needed for the caret to render in Firefox. */
+            caret-color: rgb(255, 128, 255);
+        }
+
+        </style>
+    </head>
+    <body>
+        <p>The caret should show as a green flashing square below.</p>
+        <div id="test-container">
+            <div id="test" contenteditable="true">
+                <span>&nbsp;<!-- Needed for the caret to render in Firefox. --></span>
+            </div>
+        </div>
+        <script>
+            document.getElementById("test").focus();
+            window.getSelection().modify("move", "left", "character"); // Place the caret at the start of the <span>.
+        </script>
+    </body>
+</html>
diff --git a/LayoutTests/platform/ios/TestExpectations b/LayoutTests/platform/ios/TestExpectations
index f2b6825c..96df023 100644
--- a/LayoutTests/platform/ios/TestExpectations
+++ b/LayoutTests/platform/ios/TestExpectations
@@ -1045,6 +1045,7 @@
 fast/css/caret-color-span-inside-editable-parent.html [ Skip ]
 fast/css/caret-color.html [ Skip ]
 fast/history/visited-link-caret-color.html [ Skip ]
+css3/color-filters/color-filter-caret-color [ Skip ]
 
 # Run webrtc tests on iOS 11
 imported/w3c/web-platform-tests/webrtc [ Pass ]
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 94ad207..f5df448 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,20 @@
+2018-04-30  Simon Fraser  <simon.fraser@apple.com>
+
+        Make color-filter affect caret-color
+        https://bugs.webkit.org/show_bug.cgi?id=185129
+        rdar://problem/39829066
+
+        Reviewed by Tim Horton.
+        
+        Transform the colors used to compare the caret color with the background through
+        color-filter (since we want contrasting colors after filters are applied), and
+        transform caret-color itself.
+
+        Test: css3/color-filters/color-filter-caret-color.html
+
+        * editing/FrameSelection.cpp:
+        (WebCore::CaretBase::paintCaret const):
+
 2018-04-30  Michael Catanzaro  <mcatanzaro@igalia.com>
 
         [GTK] Webkit should spoof as Safari on a Mac when on Chase.com
diff --git a/Source/WebCore/editing/FrameSelection.cpp b/Source/WebCore/editing/FrameSelection.cpp
index 7f2d779..0683af2 100644
--- a/Source/WebCore/editing/FrameSelection.cpp
+++ b/Source/WebCore/editing/FrameSelection.cpp
@@ -1754,13 +1754,13 @@
         auto computeCaretColor = [] (const RenderStyle& elementStyle, const RenderStyle* rootEditableStyle) {
             // CSS value "auto" is treated as an invalid color.
             if (!elementStyle.caretColor().isValid() && rootEditableStyle) {
-                auto rootEditableBackgroundColor = rootEditableStyle->visitedDependentColor(CSSPropertyBackgroundColor);
-                auto elementBackgroundColor = elementStyle.visitedDependentColor(CSSPropertyBackgroundColor);
+                auto rootEditableBackgroundColor = rootEditableStyle->visitedDependentColorWithColorFilter(CSSPropertyBackgroundColor);
+                auto elementBackgroundColor = elementStyle.visitedDependentColorWithColorFilter(CSSPropertyBackgroundColor);
                 auto disappearsIntoBackground = rootEditableBackgroundColor.blend(elementBackgroundColor) == rootEditableBackgroundColor;
                 if (disappearsIntoBackground)
-                    return rootEditableStyle->visitedDependentColor(CSSPropertyCaretColor);
+                    return rootEditableStyle->visitedDependentColorWithColorFilter(CSSPropertyCaretColor);
             }
-            return elementStyle.visitedDependentColor(CSSPropertyCaretColor);
+            return elementStyle.visitedDependentColorWithColorFilter(CSSPropertyCaretColor);
         };
         auto* rootEditableElement = node->rootEditableElement();
         auto* rootEditableStyle = rootEditableElement && rootEditableElement->renderer() ? &rootEditableElement->renderer()->style() : nullptr;