Title: [251331] branches/safari-608-branch
Revision
251331
Author
bshaf...@apple.com
Date
2019-10-20 10:32:28 -0700 (Sun, 20 Oct 2019)

Log Message

Cherry-pick r249517. rdar://problem/56000099

    Mail appears to be double inverting code copied from Notes, Xcode, or Terminal.
    https://bugs.webkit.org/show_bug.cgi?id=201368
    rdar://problem/40529867

    Reviewed by Ryosuke Niwa.

    Source/WebCore:

    Dark mode content that is pasted should have the inline styles inverse color
    transformed by the color filter to match the color filtered document contents.

    Layout Test: editing/pasteboard/paste-dark-mode-color-filtered.html
    API Tests: PasteHTML.TransformColorsOfDarkContent, PasteHTML.DoesNotTransformColorsOfLightContent,
        PasteRTFD.TransformColorsOfDarkContent, PasteRTFD.DoesNotTransformColorsOfLightContent

    * editing/EditingStyle.cpp:
    (WebCore::EditingStyle::inverseTransformColorIfNeeded): Added caret-color to the transformed properties.
    * editing/ReplaceSelectionCommand.cpp:
    (WebCore::fragmentNeedsColorTransformed): Added.
    (WebCore::ReplaceSelectionCommand::inverseTransformColor): Added.
    (WebCore::ReplaceSelectionCommand::doApply): Call fragmentNeedsColorTransformed() and inverseTransformColor().
    * editing/ReplaceSelectionCommand.h:

    Tools:

    Added Tests: PasteHTML.TransformColorsOfDarkContent, PasteHTML.DoesNotTransformColorsOfLightContent,
        PasteRTFD.TransformColorsOfDarkContent, PasteRTFD.DoesNotTransformColorsOfLightContent

    * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
    * TestWebKitAPI/Tests/WebKitCocoa/PasteHTML.mm:
    (createWebViewWithCustomPasteboardDataSetting): Added argument to enable color filter.
    * TestWebKitAPI/Tests/WebKitCocoa/PasteRTFD.mm:
    (createWebViewWithCustomPasteboardDataEnabled): Added argument to enable color filter.
    * TestWebKitAPI/Tests/WebKitCocoa/rich-color-filtered.html: Added.
    * TestWebKitAPI/cocoa/TestWKWebView.h:
    * TestWebKitAPI/cocoa/TestWKWebView.mm:
    (-[TestWKWebView forceDarkMode]):

    LayoutTests:

    * TestExpectations:
    * editing/pasteboard/paste-dark-mode-color-filtered-expected.txt: Added.
    * editing/pasteboard/paste-dark-mode-color-filtered.html: Added.
    * platform/ios-12/TestExpectations:
    * platform/ios/TestExpectations:
    * platform/mac/TestExpectations:

    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249517 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Modified Paths

Added Paths

Diff

Modified: branches/safari-608-branch/LayoutTests/ChangeLog (251330 => 251331)


--- branches/safari-608-branch/LayoutTests/ChangeLog	2019-10-20 15:09:21 UTC (rev 251330)
+++ branches/safari-608-branch/LayoutTests/ChangeLog	2019-10-20 17:32:28 UTC (rev 251331)
@@ -1,3 +1,71 @@
+2019-10-15  Kocsen Chung  <kocsen_ch...@apple.com>
+
+        Cherry-pick r249517. rdar://problem/56000099
+
+    Mail appears to be double inverting code copied from Notes, Xcode, or Terminal.
+    https://bugs.webkit.org/show_bug.cgi?id=201368
+    rdar://problem/40529867
+    
+    Reviewed by Ryosuke Niwa.
+    
+    Source/WebCore:
+    
+    Dark mode content that is pasted should have the inline styles inverse color
+    transformed by the color filter to match the color filtered document contents.
+    
+    Layout Test: editing/pasteboard/paste-dark-mode-color-filtered.html
+    API Tests: PasteHTML.TransformColorsOfDarkContent, PasteHTML.DoesNotTransformColorsOfLightContent,
+        PasteRTFD.TransformColorsOfDarkContent, PasteRTFD.DoesNotTransformColorsOfLightContent
+    
+    * editing/EditingStyle.cpp:
+    (WebCore::EditingStyle::inverseTransformColorIfNeeded): Added caret-color to the transformed properties.
+    * editing/ReplaceSelectionCommand.cpp:
+    (WebCore::fragmentNeedsColorTransformed): Added.
+    (WebCore::ReplaceSelectionCommand::inverseTransformColor): Added.
+    (WebCore::ReplaceSelectionCommand::doApply): Call fragmentNeedsColorTransformed() and inverseTransformColor().
+    * editing/ReplaceSelectionCommand.h:
+    
+    Tools:
+    
+    Added Tests: PasteHTML.TransformColorsOfDarkContent, PasteHTML.DoesNotTransformColorsOfLightContent,
+        PasteRTFD.TransformColorsOfDarkContent, PasteRTFD.DoesNotTransformColorsOfLightContent
+    
+    * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+    * TestWebKitAPI/Tests/WebKitCocoa/PasteHTML.mm:
+    (createWebViewWithCustomPasteboardDataSetting): Added argument to enable color filter.
+    * TestWebKitAPI/Tests/WebKitCocoa/PasteRTFD.mm:
+    (createWebViewWithCustomPasteboardDataEnabled): Added argument to enable color filter.
+    * TestWebKitAPI/Tests/WebKitCocoa/rich-color-filtered.html: Added.
+    * TestWebKitAPI/cocoa/TestWKWebView.h:
+    * TestWebKitAPI/cocoa/TestWKWebView.mm:
+    (-[TestWKWebView forceDarkMode]):
+    
+    LayoutTests:
+    
+    * TestExpectations:
+    * editing/pasteboard/paste-dark-mode-color-filtered-expected.txt: Added.
+    * editing/pasteboard/paste-dark-mode-color-filtered.html: Added.
+    * platform/ios-12/TestExpectations:
+    * platform/ios/TestExpectations:
+    * platform/mac/TestExpectations:
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249517 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2019-09-04  Timothy Hatcher  <timo...@apple.com>
+
+            Mail appears to be double inverting code copied from Notes, Xcode, or Terminal.
+            https://bugs.webkit.org/show_bug.cgi?id=201368
+            rdar://problem/40529867
+
+            Reviewed by Ryosuke Niwa.
+
+            * TestExpectations:
+            * editing/pasteboard/paste-dark-mode-color-filtered-expected.txt: Added.
+            * editing/pasteboard/paste-dark-mode-color-filtered.html: Added.
+            * platform/ios-12/TestExpectations:
+            * platform/ios/TestExpectations:
+            * platform/mac/TestExpectations:
+
 2019-10-04  Kocsen Chung  <kocsen_ch...@apple.com>
 
         Cherry-pick r249436. rdar://problem/55989217

Modified: branches/safari-608-branch/LayoutTests/TestExpectations (251330 => 251331)


--- branches/safari-608-branch/LayoutTests/TestExpectations	2019-10-20 15:09:21 UTC (rev 251330)
+++ branches/safari-608-branch/LayoutTests/TestExpectations	2019-10-20 17:32:28 UTC (rev 251331)
@@ -86,10 +86,11 @@
 # These tests don't have to be platform-specific, but they are only implemented on Mac now.
 fast/images/eps-as-image.html [ Skip ]
 
-# Only applicable on macOS
+# Only applicable on platforms with dark mode support
 css-dark-mode [ Skip ]
 fast/css/apple-system-control-colors.html [ Skip ]
 inspector/css/force-page-appearance.html [ Skip ]
+editing/pasteboard/paste-dark-mode-color-filtered.html [ Skip ]
 
 # Only Mac supports force tests.
 fast/events/cancelled-force-click-link-navigation.html [ Skip ]

Added: branches/safari-608-branch/LayoutTests/editing/pasteboard/paste-dark-mode-color-filtered-expected.txt (0 => 251331)


--- branches/safari-608-branch/LayoutTests/editing/pasteboard/paste-dark-mode-color-filtered-expected.txt	                        (rev 0)
+++ branches/safari-608-branch/LayoutTests/editing/pasteboard/paste-dark-mode-color-filtered-expected.txt	2019-10-20 17:32:28 UTC (rev 251331)
@@ -0,0 +1,27 @@
+This test checks that pasting into a color filtered dark mode document inserts light mode transformed content.
+
+PASS pastedMarkup is '<span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">Hello</span>'
+PASS pastedMarkup is '<span style="caret-color: rgb(21, 21, 21); color: rgb(21, 21, 21); background-color: rgb(255, 255, 255);">Hello</span>'
+PASS pastedMarkup is '<span style="caret-color: rgb(21, 21, 21); color: rgb(21, 21, 21); background-color: rgb(213, 213, 213);">Hello</span>'
+PASS pastedMarkup is '<span style="color: rgb(106, 106, 106);">Hello</span><span style="color: rgb(127, 128, 127);">Hello 2</span>'
+PASS pastedMarkup is '<span style="caret-color: rgb(127, 128, 127); color: rgb(127, 128, 127);">Hello</span>'
+PASS pastedMarkup is '<span style="caret-color: rgb(170, 170, 170); color: rgb(170, 170, 170);">Hello</span>'
+PASS pastedMarkup is '<span style="caret-color: rgb(191, 191, 191); color: rgb(191, 191, 191);">Hello</span>'
+PASS pastedMarkup is '<li>Item 1</li><li><span style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">Hello</span></li><li>Item 2</li>'
+PASS pastedMarkup is '<li>Item 1</li><li style="color: rgb(21, 21, 21); background-color: rgb(213, 213, 213);">Hello 1</li><li>Hello 2</li><li>Item 2</li>'
+PASS pastedMarkup is '<li>Item 1</li><li>Hello 1</li><li style="color: rgb(127, 128, 127);">Hello 2</li><li>Item 2</li>'
+PASS pastedMarkup is '<span style="caret-color: rgb(101, 101, 101); color: rgb(101, 101, 101);">Hello</span>'
+PASS pastedMarkup is '<span style="caret-color: rgb(90, 90, 90); color: rgb(90, 90, 90);">Hello</span>'
+PASS pastedMarkup is '<span style="color: rgb(85, 85, 85);">Hello</span><span style="background-color: black;">Hello 2</span>'
+PASS pastedMarkup is '<span style="caret-color: rgb(68, 68, 68); color: rgb(68, 68, 68);">Hello</span>'
+PASS pastedMarkup is '<span style="caret-color: rgb(68, 68, 68); color: rgb(68, 68, 68);">Hello</span>'
+PASS pastedMarkup is '<span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);">Hello</span>'
+PASS pastedMarkup is '<span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">Hello</span>'
+PASS pastedMarkup is '<span style="background-color: rgb(255, 255, 255);">Hello</span>'
+PASS pastedMarkup is '<li>Item 1</li><li><span style="background-color: white;">Hello</span></li><li>Item 2</li>'
+PASS pastedMarkup is '<li>Item 1</li><li style="color: rgb(85, 85, 85); background-color: rgb(235, 235, 235);">Hello 1</li><li>Hello 2</li><li>Item 2</li>'
+PASS pastedMarkup is '<li>Item 1</li><li>Hello 1</li><li style="color: black;">Hello 2</li><li>Item 2</li>'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: branches/safari-608-branch/LayoutTests/editing/pasteboard/paste-dark-mode-color-filtered.html (0 => 251331)


--- branches/safari-608-branch/LayoutTests/editing/pasteboard/paste-dark-mode-color-filtered.html	                        (rev 0)
+++ branches/safari-608-branch/LayoutTests/editing/pasteboard/paste-dark-mode-color-filtered.html	2019-10-20 17:32:28 UTC (rev 251331)
@@ -0,0 +1,95 @@
+<!DOCTYPE html><!-- webkit-test-runner [ enableColorFilter=true ] -->
+<html>
+<head>
+    <script src=""
+    <script src=""
+    <style>
+        :root {
+            color-scheme: dark;
+            -apple-color-filter: apple-invert-lightness();
+        }
+    </style>
+</head>
+<body>
+    <p id="description">This test checks that pasting into a color filtered dark mode document inserts light mode transformed content.</p>
+    <div id="console"></div>
+
+    <script>
+    if (window.internals)
+        internals.settings.setUseDarkAppearance(true);
+
+    let sel = document.getSelection();
+    let root = document.createElement("root");
+    document.body.appendChild(root);
+
+    function createEditable(tagName, markup) {
+        let node = document.createElement(tagName);
+        node.contentEditable = true;
+        if (markup)
+            node.innerHTML = markup;
+        return node;
+    }
+
+    function testCopyPaste(originalMarkup, expected, asList = false) {
+        let tagName = asList ? "ul" : "div";
+        let copyNode = createEditable(tagName, originalMarkup);
+        root.appendChild(copyNode);
+        copyNode.focus();
+
+        document.execCommand("SelectAll", false);
+        document.execCommand("Copy", false);
+
+        copyNode.remove();
+
+        let pasteNode = createEditable(tagName);
+        root.appendChild(pasteNode);
+
+        if (asList) {
+            pasteNode.innerHTML = "<li>Item 1</li><li>Item 2</li>";
+            pasteNode.focus();
+            moveSelectionForwardByLineCommand();
+        } else
+            pasteNode.focus();
+
+        document.execCommand("Paste", false);
+
+        pastedMarkup = pasteNode.innerHTML;
+
+        shouldBe("pastedMarkup", "'" + expected + "'");
+    }
+
+    // Transformed on paste
+    testCopyPaste("<span style=\"color: white; background-color: black\">Hello</span>", "<span style=\"caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">Hello</span>");
+    testCopyPaste("<span style=\"color: rgb(238, 238, 238); background-color: rgb(51, 51, 51)\">Hello</span>", "<span style=\"caret-color: rgb(21, 21, 21); color: rgb(21, 21, 21); background-color: rgb(255, 255, 255);\">Hello</span>");
+    testCopyPaste("<span style=\"color: rgb(238, 238, 238); background-color: rgb(85, 85, 85)\">Hello</span>", "<span style=\"caret-color: rgb(21, 21, 21); color: rgb(21, 21, 21); background-color: rgb(213, 213, 213);\">Hello</span>");
+    testCopyPaste("<span style=\"color: rgb(170, 170, 170)\">Hello</span><span style=\"color: rgb(153, 153, 153)\">Hello 2</span>", "<span style=\"color: rgb(106, 106, 106);\">Hello</span><span style=\"color: rgb(127, 128, 127);\">Hello 2</span>");
+    testCopyPaste("<span style=\"color: rgb(153, 153, 153)\">Hello</span>", "<span style=\"caret-color: rgb(127, 128, 127); color: rgb(127, 128, 127);\">Hello</span>");
+    testCopyPaste("<span style=\"color: rgb(119, 119, 119)\">Hello</span>", "<span style=\"caret-color: rgb(170, 170, 170); color: rgb(170, 170, 170);\">Hello</span>");
+    testCopyPaste("<span style=\"color: rgb(102, 102, 102)\">Hello</span>", "<span style=\"caret-color: rgb(191, 191, 191); color: rgb(191, 191, 191);\">Hello</span>");
+
+    // Transformed list items on paste
+    testCopyPaste("<li><span style=\"color: white; background-color: black\">Hello</span></li>", "<li>Item 1</li><li><span style=\"color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">Hello</span></li><li>Item 2</li>", true);
+    testCopyPaste("<li style=\"color: rgb(238, 238, 238); background-color: rgb(85, 85, 85)\">Hello 1</li><li>Hello 2</li>", "<li>Item 1</li><li style=\"color: rgb(21, 21, 21); background-color: rgb(213, 213, 213);\">Hello 1</li><li>Hello 2</li><li>Item 2</li>", true);
+    testCopyPaste("<li>Hello 1</li><li style=\"color: rgb(153, 153, 153)\">Hello 2</li>", "<li>Item 1</li><li>Hello 1</li><li style=\"color: rgb(127, 128, 127);\">Hello 2</li><li>Item 2</li>", true);
+
+    // Not transformed on paste
+    testCopyPaste("<span style=\"color: rgb(101, 101, 101)\">Hello</span>", "<span style=\"caret-color: rgb(101, 101, 101); color: rgb(101, 101, 101);\">Hello</span>");
+    testCopyPaste("<span style=\"color: rgb(90, 90, 90)\">Hello</span>", "<span style=\"caret-color: rgb(90, 90, 90); color: rgb(90, 90, 90);\">Hello</span>");
+    testCopyPaste("<span style=\"color: rgb(85, 85, 85)\">Hello</span><span style=\"color: white; background-color: black\">Hello 2</span>", "<span style=\"color: rgb(85, 85, 85);\">Hello</span><span style=\"background-color: black;\">Hello 2</span>");
+    testCopyPaste("<span style=\"color: rgb(68, 68, 68)\">Hello</span>", "<span style=\"caret-color: rgb(68, 68, 68); color: rgb(68, 68, 68);\">Hello</span>");
+    testCopyPaste("<span style=\"color: rgb(68, 68, 68)\">Hello</span>", "<span style=\"caret-color: rgb(68, 68, 68); color: rgb(68, 68, 68);\">Hello</span>");
+    testCopyPaste("<span style=\"color: black\">Hello</span>", "<span style=\"caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);\">Hello</span>");
+    testCopyPaste("<span style=\"color: black; background-color: white\">Hello</span>", "<span style=\"caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\">Hello</span>");
+    testCopyPaste("<span style=\"color: white; background-color: white\">Hello</span>", "<span style=\"background-color: rgb(255, 255, 255);\">Hello</span>");
+
+    // List items not transformed on paste
+    testCopyPaste("<li><span style=\"color: white; background-color: white\">Hello</span></li>", "<li>Item 1</li><li><span style=\"background-color: white;\">Hello</span></li><li>Item 2</li>", true);
+    testCopyPaste("<li style=\"color: rgb(85, 85, 85); background-color: rgb(235, 235, 235)\">Hello 1</li><li>Hello 2</li>", "<li>Item 1</li><li style=\"color: rgb(85, 85, 85); background-color: rgb(235, 235, 235);\">Hello 1</li><li>Hello 2</li><li>Item 2</li>", true);
+    testCopyPaste("<li>Hello 1</li><li style=\"color: black\">Hello 2</li>", "<li>Item 1</li><li>Hello 1</li><li style=\"color: black;\">Hello 2</li><li>Item 2</li>", true);
+
+    root.style.display = "none";
+    </script>
+
+    <script src=""
+</body>
+</html>

Modified: branches/safari-608-branch/LayoutTests/platform/ios/TestExpectations (251330 => 251331)


--- branches/safari-608-branch/LayoutTests/platform/ios/TestExpectations	2019-10-20 15:09:21 UTC (rev 251330)
+++ branches/safari-608-branch/LayoutTests/platform/ios/TestExpectations	2019-10-20 17:32:28 UTC (rev 251331)
@@ -3244,6 +3244,7 @@
 # Dark Mode is iOS 13 and later.
 css-dark-mode [ Pass ]
 css-dark-mode/older-systems [ Skip ]
+editing/pasteboard/paste-dark-mode-color-filtered.html [ Pass ]
 
 fast/forms/auto-fill-button/caps-lock-indicator-should-be-visible-after-hiding-auto-fill-strong-password-button.html [ Pass ]
 fast/forms/auto-fill-button/caps-lock-indicator-should-not-be-visible-when-auto-fill-strong-password-button-is-visible.html [ Pass ]

Modified: branches/safari-608-branch/LayoutTests/platform/ios-12/TestExpectations (251330 => 251331)


--- branches/safari-608-branch/LayoutTests/platform/ios-12/TestExpectations	2019-10-20 15:09:21 UTC (rev 251330)
+++ branches/safari-608-branch/LayoutTests/platform/ios-12/TestExpectations	2019-10-20 17:32:28 UTC (rev 251331)
@@ -1,5 +1,6 @@
 css-dark-mode [ Skip ]
 css-dark-mode/older-systems [ Pass ]
+editing/pasteboard/paste-dark-mode-color-filtered.html [ Skip ]
 
 # <rdar://problem/48781098> HEIF and HEICS images are supported only on iOS 13
 fast/images/animated-heics-draw.html [ Skip ]

Modified: branches/safari-608-branch/LayoutTests/platform/mac/TestExpectations (251330 => 251331)


--- branches/safari-608-branch/LayoutTests/platform/mac/TestExpectations	2019-10-20 15:09:21 UTC (rev 251330)
+++ branches/safari-608-branch/LayoutTests/platform/mac/TestExpectations	2019-10-20 17:32:28 UTC (rev 251331)
@@ -1746,6 +1746,7 @@
 [ Mojave+ ] css-dark-mode [ Pass ]
 [ Mojave+ ] css-dark-mode/older-systems [ Skip ]
 [ Mojave+ ] inspector/css/force-page-appearance.html [ Pass ]
+[ Mojave+ ] editing/pasteboard/paste-dark-mode-color-filtered.html [ Pass ]
 
 # Test Dark Mode CSS support for light mode on older systems.
 [ Sierra HighSierra ] css-dark-mode/older-systems [ Pass ]

Modified: branches/safari-608-branch/Source/WebCore/ChangeLog (251330 => 251331)


--- branches/safari-608-branch/Source/WebCore/ChangeLog	2019-10-20 15:09:21 UTC (rev 251330)
+++ branches/safari-608-branch/Source/WebCore/ChangeLog	2019-10-20 17:32:28 UTC (rev 251331)
@@ -1,3 +1,79 @@
+2019-10-15  Kocsen Chung  <kocsen_ch...@apple.com>
+
+        Cherry-pick r249517. rdar://problem/56000099
+
+    Mail appears to be double inverting code copied from Notes, Xcode, or Terminal.
+    https://bugs.webkit.org/show_bug.cgi?id=201368
+    rdar://problem/40529867
+    
+    Reviewed by Ryosuke Niwa.
+    
+    Source/WebCore:
+    
+    Dark mode content that is pasted should have the inline styles inverse color
+    transformed by the color filter to match the color filtered document contents.
+    
+    Layout Test: editing/pasteboard/paste-dark-mode-color-filtered.html
+    API Tests: PasteHTML.TransformColorsOfDarkContent, PasteHTML.DoesNotTransformColorsOfLightContent,
+        PasteRTFD.TransformColorsOfDarkContent, PasteRTFD.DoesNotTransformColorsOfLightContent
+    
+    * editing/EditingStyle.cpp:
+    (WebCore::EditingStyle::inverseTransformColorIfNeeded): Added caret-color to the transformed properties.
+    * editing/ReplaceSelectionCommand.cpp:
+    (WebCore::fragmentNeedsColorTransformed): Added.
+    (WebCore::ReplaceSelectionCommand::inverseTransformColor): Added.
+    (WebCore::ReplaceSelectionCommand::doApply): Call fragmentNeedsColorTransformed() and inverseTransformColor().
+    * editing/ReplaceSelectionCommand.h:
+    
+    Tools:
+    
+    Added Tests: PasteHTML.TransformColorsOfDarkContent, PasteHTML.DoesNotTransformColorsOfLightContent,
+        PasteRTFD.TransformColorsOfDarkContent, PasteRTFD.DoesNotTransformColorsOfLightContent
+    
+    * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+    * TestWebKitAPI/Tests/WebKitCocoa/PasteHTML.mm:
+    (createWebViewWithCustomPasteboardDataSetting): Added argument to enable color filter.
+    * TestWebKitAPI/Tests/WebKitCocoa/PasteRTFD.mm:
+    (createWebViewWithCustomPasteboardDataEnabled): Added argument to enable color filter.
+    * TestWebKitAPI/Tests/WebKitCocoa/rich-color-filtered.html: Added.
+    * TestWebKitAPI/cocoa/TestWKWebView.h:
+    * TestWebKitAPI/cocoa/TestWKWebView.mm:
+    (-[TestWKWebView forceDarkMode]):
+    
+    LayoutTests:
+    
+    * TestExpectations:
+    * editing/pasteboard/paste-dark-mode-color-filtered-expected.txt: Added.
+    * editing/pasteboard/paste-dark-mode-color-filtered.html: Added.
+    * platform/ios-12/TestExpectations:
+    * platform/ios/TestExpectations:
+    * platform/mac/TestExpectations:
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249517 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2019-09-04  Timothy Hatcher  <timo...@apple.com>
+
+            Mail appears to be double inverting code copied from Notes, Xcode, or Terminal.
+            https://bugs.webkit.org/show_bug.cgi?id=201368
+            rdar://problem/40529867
+
+            Reviewed by Ryosuke Niwa.
+
+            Dark mode content that is pasted should have the inline styles inverse color
+            transformed by the color filter to match the color filtered document contents.
+
+            Layout Test: editing/pasteboard/paste-dark-mode-color-filtered.html
+            API Tests: PasteHTML.TransformColorsOfDarkContent, PasteHTML.DoesNotTransformColorsOfLightContent,
+                PasteRTFD.TransformColorsOfDarkContent, PasteRTFD.DoesNotTransformColorsOfLightContent
+
+            * editing/EditingStyle.cpp:
+            (WebCore::EditingStyle::inverseTransformColorIfNeeded): Added caret-color to the transformed properties.
+            * editing/ReplaceSelectionCommand.cpp:
+            (WebCore::fragmentNeedsColorTransformed): Added.
+            (WebCore::ReplaceSelectionCommand::inverseTransformColor): Added.
+            (WebCore::ReplaceSelectionCommand::doApply): Call fragmentNeedsColorTransformed() and inverseTransformColor().
+            * editing/ReplaceSelectionCommand.h:
+
 2019-10-04  Kocsen Chung  <kocsen_ch...@apple.com>
 
         Cherry-pick r249436. rdar://problem/55989217

Modified: branches/safari-608-branch/Source/WebCore/editing/EditingStyle.cpp (251330 => 251331)


--- branches/safari-608-branch/Source/WebCore/editing/EditingStyle.cpp	2019-10-20 15:09:21 UTC (rev 251330)
+++ branches/safari-608-branch/Source/WebCore/editing/EditingStyle.cpp	2019-10-20 17:32:28 UTC (rev 251331)
@@ -1590,8 +1590,9 @@
         return *this;
 
     bool hasColor = m_mutableStyle->getPropertyCSSValue(CSSPropertyColor);
+    bool hasCaretColor = m_mutableStyle->getPropertyCSSValue(CSSPropertyCaretColor);
     bool hasBackgroundColor = m_mutableStyle->getPropertyCSSValue(CSSPropertyBackgroundColor);
-    if (!hasColor && !hasBackgroundColor)
+    if (!hasColor && !hasCaretColor && !hasBackgroundColor)
         return *this;
 
     auto styleWithInvertedColors = copy();
@@ -1607,6 +1608,9 @@
     if (hasColor)
         invertedColor(CSSPropertyColor);
 
+    if (hasCaretColor)
+        invertedColor(CSSPropertyCaretColor);
+
     if (hasBackgroundColor)
         invertedColor(CSSPropertyBackgroundColor);
 

Modified: branches/safari-608-branch/Source/WebCore/editing/ReplaceSelectionCommand.cpp (251330 => 251331)


--- branches/safari-608-branch/Source/WebCore/editing/ReplaceSelectionCommand.cpp	2019-10-20 15:09:21 UTC (rev 251330)
+++ branches/safari-608-branch/Source/WebCore/editing/ReplaceSelectionCommand.cpp	2019-10-20 17:32:28 UTC (rev 251331)
@@ -55,6 +55,7 @@
 #include "HTMLTitleElement.h"
 #include "NodeList.h"
 #include "NodeRenderStyle.h"
+#include "Position.h"
 #include "RenderInline.h"
 #include "RenderText.h"
 #include "ScriptElement.h"
@@ -520,6 +521,82 @@
         && !isBlock(sourceNode) && !isBlock(destinationNode);
 }
 
+static bool fragmentNeedsColorTransformed(ReplacementFragment& fragment, const Position& insertionPos)
+{
+    // Dark mode content that is inserted should have the inline styles inverse color
+    // transformed by the color filter to match the color filtered document contents.
+    // This applies to Mail and Notes when pasting from Xcode. <rdar://problem/40529867>
+
+    RefPtr<Element> editableRoot = insertionPos.rootEditableElement();
+    ASSERT(editableRoot);
+    if (!editableRoot)
+        return false;
+
+    auto* editableRootRenderer = editableRoot->renderer();
+    if (!editableRootRenderer || !editableRootRenderer->style().hasAppleColorFilter())
+        return false;
+
+    const auto& colorFilter = editableRootRenderer->style().appleColorFilter();
+    for (const auto& colorFilterOperation : colorFilter.operations()) {
+        if (colorFilterOperation->type() != FilterOperation::APPLE_INVERT_LIGHTNESS)
+            return false;
+    }
+
+    auto propertyLightness = [&](const StyleProperties& inlineStyle, CSSPropertyID propertyID) -> Optional<double> {
+        auto color = inlineStyle.propertyAsColor(propertyID);
+        if (!color || !color.value().isVisible() || color.value().isSemantic())
+            return { };
+
+        double hue, saturation, lightness;
+        color.value().getHSL(hue, saturation, lightness);
+        return lightness;
+    };
+
+    const double lightnessDarkEnoughForText = 0.4;
+    const double lightnessLightEnoughForBackground = 0.6;
+
+    for (RefPtr<Node> node = fragment.firstChild(); node; node = NodeTraversal::next(*node)) {
+        if (!is<StyledElement>(*node))
+            continue;
+
+        auto& element = downcast<StyledElement>(*node);
+        auto* inlineStyle = element.inlineStyle();
+        if (!inlineStyle)
+            continue;
+
+        auto textLightness = propertyLightness(*inlineStyle, CSSPropertyColor);
+        if (textLightness && *textLightness < lightnessDarkEnoughForText)
+            return false;
+
+        auto backgroundLightness = propertyLightness(*inlineStyle, CSSPropertyBackgroundColor);
+        if (backgroundLightness && *backgroundLightness > lightnessLightEnoughForBackground)
+            return false;
+    }
+
+    return true;
+}
+
+void ReplaceSelectionCommand::inverseTransformColor(InsertedNodes& insertedNodes)
+{
+    RefPtr<Node> pastEndNode = insertedNodes.pastLastLeaf();
+    for (RefPtr<Node> node = insertedNodes.firstNodeInserted(); node && node != pastEndNode; node = NodeTraversal::next(*node)) {
+        if (!is<StyledElement>(*node))
+            continue;
+
+        auto& element = downcast<StyledElement>(*node);
+        auto* inlineStyle = element.inlineStyle();
+        if (!inlineStyle)
+            continue;
+
+        auto editingStyle = EditingStyle::create(inlineStyle);
+        auto transformedStyle = editingStyle->inverseTransformColorIfNeeded(element);
+        if (editingStyle.ptr() == transformedStyle.ptr())
+            continue;
+
+        setNodeAttribute(element, styleAttr, transformedStyle->style()->asText());
+    }
+}
+
 // Style rules that match just inserted elements could change their appearance, like
 // a div inserted into a document with div { display:inline; }.
 void ReplaceSelectionCommand::removeRedundantStylesAndKeepStyleSpanInline(InsertedNodes& insertedNodes)
@@ -1099,8 +1176,8 @@
     insertionPos = positionOutsideTabSpan(insertionPos);
 
     bool hasBlankLinesBetweenParagraphs = hasBlankLineBetweenParagraphs(insertionPos);
-    
     bool handledStyleSpans = handleStyleSpansBeforeInsertion(fragment, insertionPos);
+    bool needsColorTransformed = fragmentNeedsColorTransformed(fragment, insertionPos);
 
     // We're finished if there is nothing to add.
     if (fragment.isEmpty() || !fragment.firstChild())
@@ -1211,11 +1288,14 @@
             removeNode(*nodeToRemove);
         }
     }
-    
+
     makeInsertedContentRoundTrippableWithHTMLTreeBuilder(insertedNodes);
     if (insertedNodes.isEmpty())
         return;
 
+    if (needsColorTransformed)
+        inverseTransformColor(insertedNodes);
+
     removeRedundantStylesAndKeepStyleSpanInline(insertedNodes);
     if (insertedNodes.isEmpty())
         return;

Modified: branches/safari-608-branch/Source/WebCore/editing/ReplaceSelectionCommand.h (251330 => 251331)


--- branches/safari-608-branch/Source/WebCore/editing/ReplaceSelectionCommand.h	2019-10-20 15:09:21 UTC (rev 251330)
+++ branches/safari-608-branch/Source/WebCore/editing/ReplaceSelectionCommand.h	2019-10-20 17:32:28 UTC (rev 251331)
@@ -102,6 +102,7 @@
     void removeUnrenderedTextNodesAtEnds(InsertedNodes&);
     
     void removeRedundantStylesAndKeepStyleSpanInline(InsertedNodes&);
+    void inverseTransformColor(InsertedNodes&);
     void makeInsertedContentRoundTrippableWithHTMLTreeBuilder(InsertedNodes&);
     void moveNodeOutOfAncestor(Node&, Node& ancestor, InsertedNodes&);
     void handleStyleSpans(InsertedNodes&);

Modified: branches/safari-608-branch/Tools/ChangeLog (251330 => 251331)


--- branches/safari-608-branch/Tools/ChangeLog	2019-10-20 15:09:21 UTC (rev 251330)
+++ branches/safari-608-branch/Tools/ChangeLog	2019-10-20 17:32:28 UTC (rev 251331)
@@ -1,3 +1,77 @@
+2019-10-15  Kocsen Chung  <kocsen_ch...@apple.com>
+
+        Cherry-pick r249517. rdar://problem/56000099
+
+    Mail appears to be double inverting code copied from Notes, Xcode, or Terminal.
+    https://bugs.webkit.org/show_bug.cgi?id=201368
+    rdar://problem/40529867
+    
+    Reviewed by Ryosuke Niwa.
+    
+    Source/WebCore:
+    
+    Dark mode content that is pasted should have the inline styles inverse color
+    transformed by the color filter to match the color filtered document contents.
+    
+    Layout Test: editing/pasteboard/paste-dark-mode-color-filtered.html
+    API Tests: PasteHTML.TransformColorsOfDarkContent, PasteHTML.DoesNotTransformColorsOfLightContent,
+        PasteRTFD.TransformColorsOfDarkContent, PasteRTFD.DoesNotTransformColorsOfLightContent
+    
+    * editing/EditingStyle.cpp:
+    (WebCore::EditingStyle::inverseTransformColorIfNeeded): Added caret-color to the transformed properties.
+    * editing/ReplaceSelectionCommand.cpp:
+    (WebCore::fragmentNeedsColorTransformed): Added.
+    (WebCore::ReplaceSelectionCommand::inverseTransformColor): Added.
+    (WebCore::ReplaceSelectionCommand::doApply): Call fragmentNeedsColorTransformed() and inverseTransformColor().
+    * editing/ReplaceSelectionCommand.h:
+    
+    Tools:
+    
+    Added Tests: PasteHTML.TransformColorsOfDarkContent, PasteHTML.DoesNotTransformColorsOfLightContent,
+        PasteRTFD.TransformColorsOfDarkContent, PasteRTFD.DoesNotTransformColorsOfLightContent
+    
+    * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+    * TestWebKitAPI/Tests/WebKitCocoa/PasteHTML.mm:
+    (createWebViewWithCustomPasteboardDataSetting): Added argument to enable color filter.
+    * TestWebKitAPI/Tests/WebKitCocoa/PasteRTFD.mm:
+    (createWebViewWithCustomPasteboardDataEnabled): Added argument to enable color filter.
+    * TestWebKitAPI/Tests/WebKitCocoa/rich-color-filtered.html: Added.
+    * TestWebKitAPI/cocoa/TestWKWebView.h:
+    * TestWebKitAPI/cocoa/TestWKWebView.mm:
+    (-[TestWKWebView forceDarkMode]):
+    
+    LayoutTests:
+    
+    * TestExpectations:
+    * editing/pasteboard/paste-dark-mode-color-filtered-expected.txt: Added.
+    * editing/pasteboard/paste-dark-mode-color-filtered.html: Added.
+    * platform/ios-12/TestExpectations:
+    * platform/ios/TestExpectations:
+    * platform/mac/TestExpectations:
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249517 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2019-09-04  Timothy Hatcher  <timo...@apple.com>
+
+            Mail appears to be double inverting code copied from Notes, Xcode, or Terminal.
+            https://bugs.webkit.org/show_bug.cgi?id=201368
+            rdar://problem/40529867
+
+            Reviewed by Ryosuke Niwa.
+
+            Added Tests: PasteHTML.TransformColorsOfDarkContent, PasteHTML.DoesNotTransformColorsOfLightContent,
+                PasteRTFD.TransformColorsOfDarkContent, PasteRTFD.DoesNotTransformColorsOfLightContent
+
+            * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+            * TestWebKitAPI/Tests/WebKitCocoa/PasteHTML.mm:
+            (createWebViewWithCustomPasteboardDataSetting): Added argument to enable color filter.
+            * TestWebKitAPI/Tests/WebKitCocoa/PasteRTFD.mm:
+            (createWebViewWithCustomPasteboardDataEnabled): Added argument to enable color filter.
+            * TestWebKitAPI/Tests/WebKitCocoa/rich-color-filtered.html: Added.
+            * TestWebKitAPI/cocoa/TestWKWebView.h:
+            * TestWebKitAPI/cocoa/TestWKWebView.mm:
+            (-[TestWKWebView forceDarkMode]):
+
 2019-10-03  Alan Coon  <alanc...@apple.com>
 
         Cherry-pick r250659. rdar://problem/55954229

Modified: branches/safari-608-branch/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (251330 => 251331)


--- branches/safari-608-branch/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2019-10-20 15:09:21 UTC (rev 251330)
+++ branches/safari-608-branch/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2019-10-20 17:32:28 UTC (rev 251331)
@@ -93,6 +93,7 @@
 		1C9EB8411E380DA1005C6442 /* ComplexTextController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1C9EB8401E380DA1005C6442 /* ComplexTextController.cpp */; };
 		1CACADA1230620AE0007D54C /* WKWebViewOpaque.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1CACADA0230620AD0007D54C /* WKWebViewOpaque.mm */; };
 		1CAD1F861E5CE7DA00AF2C2C /* FontCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1CAD1F851E5CE7DA00AF2C2C /* FontCache.cpp */; };
+		1CE6FAC32320267C00E48F6E /* rich-color-filtered.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 1CE6FAC12320264F00E48F6E /* rich-color-filtered.html */; };
 		1CF59AE221E68925006E37EC /* ForceLightAppearanceInBundle_Bundle.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1CF59AE021E68925006E37EC /* ForceLightAppearanceInBundle_Bundle.mm */; };
 		1CF59AE321E68932006E37EC /* ForceLightAppearanceInBundle.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1CF59ADF21E68925006E37EC /* ForceLightAppearanceInBundle.mm */; };
 		1CF59AE521E6977D006E37EC /* dark-mode.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 1CF59AE421E696FB006E37EC /* dark-mode.html */; };
@@ -1357,6 +1358,7 @@
 				F6FDDDD614241C6F004F1729 /* push-state.html in Copy Resources */,
 				A12DDC001E8373E700CF6CAE /* rendered-image-excluding-overflow.html in Copy Resources */,
 				F46849C01EEF5EF300B937FE /* rich-and-plain-text.html in Copy Resources */,
+				1CE6FAC32320267C00E48F6E /* rich-color-filtered.html in Copy Resources */,
 				2E92B8F7216490D4005B64F0 /* rich-text-attributes.html in Copy Resources */,
 				0F5651F91FCE513500310FBC /* scroll-to-anchor.html in Copy Resources */,
 				F4E0A296211FC5FB00AF7C7F /* selected-text-and-textarea.html in Copy Resources */,
@@ -1509,6 +1511,7 @@
 		1CACADA0230620AD0007D54C /* WKWebViewOpaque.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKWebViewOpaque.mm; sourceTree = "<group>"; };
 		1CAD1F851E5CE7DA00AF2C2C /* FontCache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FontCache.cpp; sourceTree = "<group>"; };
 		1CB9BC371A67482300FE5678 /* WeakPtr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WeakPtr.cpp; sourceTree = "<group>"; };
+		1CE6FAC12320264F00E48F6E /* rich-color-filtered.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "rich-color-filtered.html"; sourceTree = "<group>"; };
 		1CF0D3781BBF2F3D00B4EF54 /* WKRetainPtr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKRetainPtr.cpp; sourceTree = "<group>"; };
 		1CF59ADF21E68925006E37EC /* ForceLightAppearanceInBundle.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ForceLightAppearanceInBundle.mm; sourceTree = "<group>"; };
 		1CF59AE021E68925006E37EC /* ForceLightAppearanceInBundle_Bundle.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ForceLightAppearanceInBundle_Bundle.mm; sourceTree = "<group>"; };
@@ -3295,6 +3298,7 @@
 				F41AB99A1EF4692C0083FA08 /* prevent-start.html */,
 				A12DDBFF1E8373C100CF6CAE /* rendered-image-excluding-overflow.html */,
 				F46849BF1EEF5EDC00B937FE /* rich-and-plain-text.html */,
+				1CE6FAC12320264F00E48F6E /* rich-color-filtered.html */,
 				2E92B8F6216490C3005B64F0 /* rich-text-attributes.html */,
 				F4E0A295211FC5A300AF7C7F /* selected-text-and-textarea.html */,
 				F4D65DA71F5E46C0009D8C27 /* selected-text-image-link-and-editable.html */,

Modified: branches/safari-608-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/PasteHTML.mm (251330 => 251331)


--- branches/safari-608-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/PasteHTML.mm	2019-10-20 15:09:21 UTC (rev 251330)
+++ branches/safari-608-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/PasteHTML.mm	2019-10-20 17:32:28 UTC (rev 251331)
@@ -57,9 +57,12 @@
 }
 #endif
 
-static RetainPtr<TestWKWebView> createWebViewWithCustomPasteboardDataSetting(bool enabled)
+static RetainPtr<TestWKWebView> createWebViewWithCustomPasteboardDataSetting(bool enabled, bool colorFilterEnabled = false)
 {
-    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 400, 400)]);
+    auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    [webViewConfiguration _setColorFilterEnabled:colorFilterEnabled];
+
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 400, 400) configuration:webViewConfiguration.get()]);
     auto preferences = (__bridge WKPreferencesRef)[[webView configuration] preferences];
     WKPreferencesSetDataTransferItemsEnabled(preferences, true);
     WKPreferencesSetCustomPasteboardDataEnabled(preferences, enabled);
@@ -357,6 +360,41 @@
         [webView stringByEvaluatingJavaScript:@"getComputedStyle(document.body).fontFamily"]);
 }
 
+#if ENABLE(DARK_MODE_CSS) && HAVE(OS_DARK_MODE_SUPPORT)
+
+TEST(PasteHTML, TransformColorsOfDarkContent)
+{
+    auto webView = createWebViewWithCustomPasteboardDataSetting(true, true);
+    [webView forceDarkMode];
+
+    [webView synchronouslyLoadTestPageNamed:@"rich-color-filtered"];
+
+    writeHTMLToPasteboard(@"<span style=\"color: rgb(238, 238, 238); background-color: rgb(51, 51, 51)\">Hello</span>");
+
+    [webView stringByEvaluatingJavaScript:@"selectRichText()"];
+    [webView paste:nil];
+
+    EXPECT_WK_STREQ([webView stringByEvaluatingJavaScript:@"rich.querySelector('span').style.color"], @"rgb(21, 21, 21)");
+    EXPECT_WK_STREQ([webView stringByEvaluatingJavaScript:@"rich.querySelector('span').style.backgroundColor"], @"rgb(255, 255, 255)");
+}
+
+TEST(PasteHTML, DoesNotTransformColorsOfLightContent)
+{
+    auto webView = createWebViewWithCustomPasteboardDataSetting(true, true);
+    [webView forceDarkMode];
+
+    [webView synchronouslyLoadTestPageNamed:@"rich-color-filtered"];
+
+    writeHTMLToPasteboard(@"<span style=\"color: rgb(101, 101, 101)\">Hello</span>");
+
+    [webView stringByEvaluatingJavaScript:@"selectRichText()"];
+    [webView paste:nil];
+
+    EXPECT_WK_STREQ([webView stringByEvaluatingJavaScript:@"rich.querySelector('span').style.color"], @"rgb(101, 101, 101)");
+}
+
+#endif // ENABLE(DARK_MODE_CSS) && HAVE(OS_DARK_MODE_SUPPORT)
+
 #endif // PLATFORM(COCOA)
 TEST(PasteHTML, DoesNotAddStandardFontFamily)
 {

Modified: branches/safari-608-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/PasteRTFD.mm (251330 => 251331)


--- branches/safari-608-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/PasteRTFD.mm	2019-10-20 15:09:21 UTC (rev 251330)
+++ branches/safari-608-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/PasteRTFD.mm	2019-10-20 17:32:28 UTC (rev 251331)
@@ -39,6 +39,12 @@
 #include <MobileCoreServices/MobileCoreServices.h>
 #endif
 
+#if USE(APPKIT)
+using PlatformColor = NSColor;
+#else
+using PlatformColor = UIColor;
+#endif
+
 @interface WKWebView ()
 - (void)paste:(id)sender;
 @end
@@ -76,9 +82,12 @@
 }
 #endif
 
-static RetainPtr<TestWKWebView> createWebViewWithCustomPasteboardDataEnabled()
+static RetainPtr<TestWKWebView> createWebViewWithCustomPasteboardDataEnabled(bool colorFilterEnabled = false)
 {
-    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 400, 400)]);
+    auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    [webViewConfiguration _setColorFilterEnabled:colorFilterEnabled];
+
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 400, 400) configuration:webViewConfiguration.get()]);
     auto preferences = (__bridge WKPreferencesRef)[[webView configuration] preferences];
     WKPreferencesSetDataTransferItemsEnabled(preferences, true);
     WKPreferencesSetCustomPasteboardDataEnabled(preferences, true);
@@ -176,7 +185,68 @@
     EXPECT_WK_STREQ("blob:", [webView stringByEvaluatingJavaScript:@"new URL(imageElement.src).protocol"]);
 }
 
-#endif // PLATFORM(MAC)
+#if ENABLE(DARK_MODE_CSS) && HAVE(OS_DARK_MODE_SUPPORT)
 
+TEST(PasteRTFD, TransformColorsOfDarkContent)
+{
+    auto webView = createWebViewWithCustomPasteboardDataEnabled(true);
+    [webView forceDarkMode];
 
+    [webView synchronouslyLoadTestPageNamed:@"rich-color-filtered"];
 
+    PlatformColor *textColor = [PlatformColor lightGrayColor];
+    PlatformColor *backgroundColor = [PlatformColor darkGrayColor];
+
+    auto hello = adoptNS([[NSAttributedString alloc] initWithString:@"Hello" attributes:@{ NSBackgroundColorAttributeName : backgroundColor, NSForegroundColorAttributeName : textColor }]);
+    auto world = adoptNS([[NSAttributedString alloc] initWithString:@" World" attributes:@{ NSForegroundColorAttributeName : textColor }]);
+    auto string = adoptNS([[NSMutableAttributedString alloc] init]);
+    [string appendAttributedString:hello.get()];
+    [string appendAttributedString:world.get()];
+
+    writeRTFToPasteboard([string RTFFromRange:NSMakeRange(0, [string length]) documentAttributes:@{ }]);
+
+    [webView stringByEvaluatingJavaScript:@"selectRichText()"];
+    [webView paste:nil];
+
+#if USE(APPKIT)
+    EXPECT_WK_STREQ([webView stringByEvaluatingJavaScript:@"rich.querySelector('p').style.color"], @"rgb(126, 126, 126)");
+    EXPECT_WK_STREQ([webView stringByEvaluatingJavaScript:@"rich.querySelector('p > span').style.backgroundColor"], @"rgb(235, 235, 235)");
+#else
+    EXPECT_WK_STREQ([webView stringByEvaluatingJavaScript:@"rich.querySelector('p').style.color"], @"rgb(106, 106, 106)");
+    EXPECT_WK_STREQ([webView stringByEvaluatingJavaScript:@"rich.querySelector('p > span').style.backgroundColor"], @"rgb(213, 213, 213)");
+#endif
+}
+
+TEST(PasteRTFD, DoesNotTransformColorsOfLightContent)
+{
+    auto webView = createWebViewWithCustomPasteboardDataEnabled(true);
+    [webView forceDarkMode];
+
+    [webView synchronouslyLoadTestPageNamed:@"rich-color-filtered"];
+
+    PlatformColor *textColor = [PlatformColor darkGrayColor];
+    PlatformColor *backgroundColor = [PlatformColor lightGrayColor];
+
+    auto hello = adoptNS([[NSAttributedString alloc] initWithString:@"Hello" attributes:@{ NSBackgroundColorAttributeName : backgroundColor, NSForegroundColorAttributeName : textColor }]);
+    auto world = adoptNS([[NSAttributedString alloc] initWithString:@" World" attributes:@{ NSForegroundColorAttributeName : textColor }]);
+    auto string = adoptNS([[NSMutableAttributedString alloc] init]);
+    [string appendAttributedString:hello.get()];
+    [string appendAttributedString:world.get()];
+
+    writeRTFToPasteboard([string RTFFromRange:NSMakeRange(0, [string length]) documentAttributes:@{ }]);
+
+    [webView stringByEvaluatingJavaScript:@"selectRichText()"];
+    [webView paste:nil];
+
+#if USE(APPKIT)
+    EXPECT_WK_STREQ([webView stringByEvaluatingJavaScript:@"rich.querySelector('p').style.color"], @"rgb(67, 67, 67)");
+    EXPECT_WK_STREQ([webView stringByEvaluatingJavaScript:@"rich.querySelector('p > span').style.backgroundColor"], @"rgb(154, 154, 154)");
+#else
+    EXPECT_WK_STREQ([webView stringByEvaluatingJavaScript:@"rich.querySelector('p').style.color"], @"rgb(85, 85, 85)");
+    EXPECT_WK_STREQ([webView stringByEvaluatingJavaScript:@"rich.querySelector('p > span').style.backgroundColor"], @"rgb(170, 170, 170)");
+#endif
+}
+
+#endif // ENABLE(DARK_MODE_CSS) && HAVE(OS_DARK_MODE_SUPPORT)
+
+#endif // PLATFORM(COCOA)

Added: branches/safari-608-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/rich-color-filtered.html (0 => 251331)


--- branches/safari-608-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/rich-color-filtered.html	                        (rev 0)
+++ branches/safari-608-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/rich-color-filtered.html	2019-10-20 17:32:28 UTC (rev 251331)
@@ -0,0 +1,27 @@
+<head>
+    <meta name="viewport" content="width=device-width">
+    <style>
+    :root {
+        color-scheme: dark;
+        -apple-color-filter: apple-invert-lightness();
+    }
+    </style>
+</head>
+
+<body>
+    <div id="rich" contenteditable>Hello world</div>
+    <script>
+    function deselectText()
+    {
+        blur();
+        getSelection().removeAllRanges();
+    }
+
+    function selectRichText()
+    {
+        deselectText();
+        let text = rich.childNodes[0];
+        getSelection().setBaseAndExtent(text, 0, text, text.data.length);
+    }
+    </script>
+</body>

Modified: branches/safari-608-branch/Tools/TestWebKitAPI/cocoa/TestWKWebView.h (251330 => 251331)


--- branches/safari-608-branch/Tools/TestWebKitAPI/cocoa/TestWKWebView.h	2019-10-20 15:09:21 UTC (rev 251330)
+++ branches/safari-608-branch/Tools/TestWebKitAPI/cocoa/TestWKWebView.h	2019-10-20 17:32:28 UTC (rev 251331)
@@ -74,6 +74,7 @@
 - (void)waitForMessage:(NSString *)message;
 - (void)performAfterLoading:(dispatch_block_t)actions;
 - (void)waitForNextPresentationUpdate;
+- (void)forceDarkMode;
 - (NSString *)stylePropertyAtSelectionStart:(NSString *)propertyName;
 - (NSString *)stylePropertyAtSelectionEnd:(NSString *)propertyName;
 - (void)collapseToStart;

Modified: branches/safari-608-branch/Tools/TestWebKitAPI/cocoa/TestWKWebView.mm (251330 => 251331)


--- branches/safari-608-branch/Tools/TestWebKitAPI/cocoa/TestWKWebView.mm	2019-10-20 15:09:21 UTC (rev 251330)
+++ branches/safari-608-branch/Tools/TestWebKitAPI/cocoa/TestWKWebView.mm	2019-10-20 17:32:28 UTC (rev 251331)
@@ -428,6 +428,17 @@
     TestWebKitAPI::Util::run(&done);
 }
 
+- (void)forceDarkMode
+{
+#if HAVE(OS_DARK_MODE_SUPPORT)
+#if USE(APPKIT)
+    [self setAppearance:[NSAppearance appearanceNamed:NSAppearanceNameDarkAqua]];
+#else
+    [self setOverrideUserInterfaceStyle:UIUserInterfaceStyleDark];
+#endif
+#endif
+}
+
 - (NSString *)stylePropertyAtSelectionStart:(NSString *)propertyName
 {
     NSString *script = [NSString stringWithFormat:@"getComputedStyle(getSelection().getRangeAt(0).startContainer.parentElement)['%@']", propertyName];
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to