<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[285451] branches/safari-612-branch</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/285451">285451</a></dd>
<dt>Author</dt> <dd>kocsen_chung@apple.com</dd>
<dt>Date</dt> <dd>2021-11-08 17:08:32 -0800 (Mon, 08 Nov 2021)</dd>
</dl>

<h3>Log Message</h3>
<pre>Cherry-pick <a href="http://trac.webkit.org/projects/webkit/changeset/281970">r281970</a>. rdar://problem/85173043

    REGRESSION (<a href="http://trac.webkit.org/projects/webkit/changeset/280767">r280767</a>): Caret color is black after pasting rich text in Mail compose in dark mode
    https://bugs.webkit.org/show_bug.cgi?id=229808
    rdar://82600990

    Reviewed by Tim Horton.

    Source/WebKit:

    Partially revert one of the changes in <a href="http://trac.webkit.org/projects/webkit/changeset/280767">r280767</a> that makes caret-color follow the immediate container node of the
    selection caret, rather than the focused element (which it previously used). This was effectively a drive-by fix
    for a FIXME about allowing `caret-color` to match child containers inside the root editable container element.
    While this matches behavior on macOS, this change also causes the caret color to become black when pasting rich
    text copied in dark mode, since we write `caret-color: rgb(0, 0, 0);` to the pasteboard when copying the editing
    style for rich text.

    In the short term, we should restore old (pre-<a href="http://trac.webkit.org/projects/webkit/changeset/280767">r280767</a>) `caret-color` on iOS; in the slightly longer term, I've
    filed bug #229809 to track unifying macOS and iOS caret-color behavior, with respect to nested editable
    container nodes.

    To retain the fix for rdar://81674787 without exhibiting the above bug, we use the selection's root editable
    container (rather than `m_focusedElement`, which was used prior to <a href="http://trac.webkit.org/projects/webkit/changeset/280767">r280767</a>).

    Test: editing/caret/ios/caret-color-in-nested-editable-containers.html

    * WebProcess/WebPage/ios/WebPageIOS.mm:
    (WebKit::WebPage::getPlatformEditorState const):

    Also adjust this logic so that we only attempt the tree-walk to find the root editable element if the selection
    has editable style.

    LayoutTests:

    Add a test to exercise the behavior of different `caret-color` values in nested editable elements.

    * editing/caret/ios/caret-color-in-nested-editable-containers-expected.txt: Added.
    * editing/caret/ios/caret-color-in-nested-editable-containers.html: Added.

    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@281970 268f45cc-cd09-0410-ab3c-d52691b4dbfc</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#branchessafari612branchLayoutTestsChangeLog">branches/safari-612-branch/LayoutTests/ChangeLog</a></li>
<li><a href="#branchessafari612branchSourceWebKitChangeLog">branches/safari-612-branch/Source/WebKit/ChangeLog</a></li>
<li><a href="#branchessafari612branchSourceWebKitWebProcessWebPageiosWebPageIOSmm">branches/safari-612-branch/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#branchessafari612branchLayoutTestseditingcaretioscaretcolorinnestededitablecontainersexpectedtxt">branches/safari-612-branch/LayoutTests/editing/caret/ios/caret-color-in-nested-editable-containers-expected.txt</a></li>
<li><a href="#branchessafari612branchLayoutTestseditingcaretioscaretcolorinnestededitablecontainershtml">branches/safari-612-branch/LayoutTests/editing/caret/ios/caret-color-in-nested-editable-containers.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="branchessafari612branchLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-612-branch/LayoutTests/ChangeLog (285450 => 285451)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-612-branch/LayoutTests/ChangeLog 2021-11-09 01:08:29 UTC (rev 285450)
+++ branches/safari-612-branch/LayoutTests/ChangeLog    2021-11-09 01:08:32 UTC (rev 285451)
</span><span class="lines">@@ -1,5 +1,62 @@
</span><span class="cx"> 2021-11-08  Kocsen Chung  <kocsen_chung@apple.com>
</span><span class="cx"> 
</span><ins>+        Cherry-pick r281970. rdar://problem/85173043
+
+    REGRESSION (r280767): Caret color is black after pasting rich text in Mail compose in dark mode
+    https://bugs.webkit.org/show_bug.cgi?id=229808
+    rdar://82600990
+    
+    Reviewed by Tim Horton.
+    
+    Source/WebKit:
+    
+    Partially revert one of the changes in r280767 that makes caret-color follow the immediate container node of the
+    selection caret, rather than the focused element (which it previously used). This was effectively a drive-by fix
+    for a FIXME about allowing `caret-color` to match child containers inside the root editable container element.
+    While this matches behavior on macOS, this change also causes the caret color to become black when pasting rich
+    text copied in dark mode, since we write `caret-color: rgb(0, 0, 0);` to the pasteboard when copying the editing
+    style for rich text.
+    
+    In the short term, we should restore old (pre-r280767) `caret-color` on iOS; in the slightly longer term, I've
+    filed bug #229809 to track unifying macOS and iOS caret-color behavior, with respect to nested editable
+    container nodes.
+    
+    To retain the fix for rdar://81674787 without exhibiting the above bug, we use the selection's root editable
+    container (rather than `m_focusedElement`, which was used prior to r280767).
+    
+    Test: editing/caret/ios/caret-color-in-nested-editable-containers.html
+    
+    * WebProcess/WebPage/ios/WebPageIOS.mm:
+    (WebKit::WebPage::getPlatformEditorState const):
+    
+    Also adjust this logic so that we only attempt the tree-walk to find the root editable element if the selection
+    has editable style.
+    
+    LayoutTests:
+    
+    Add a test to exercise the behavior of different `caret-color` values in nested editable elements.
+    
+    * editing/caret/ios/caret-color-in-nested-editable-containers-expected.txt: Added.
+    * editing/caret/ios/caret-color-in-nested-editable-containers.html: Added.
+    
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@281970 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2021-09-02  Wenson Hsieh  <wenson_hsieh@apple.com>
+
+            REGRESSION (r280767): Caret color is black after pasting rich text in Mail compose in dark mode
+            https://bugs.webkit.org/show_bug.cgi?id=229808
+            rdar://82600990
+
+            Reviewed by Tim Horton.
+
+            Add a test to exercise the behavior of different `caret-color` values in nested editable elements.
+
+            * editing/caret/ios/caret-color-in-nested-editable-containers-expected.txt: Added.
+            * editing/caret/ios/caret-color-in-nested-editable-containers.html: Added.
+
+2021-11-08  Kocsen Chung  <kocsen_chung@apple.com>
+
</ins><span class="cx">         Cherry-pick r281795. rdar://problem/85166335
</span><span class="cx"> 
</span><span class="cx">     Nullptr crash in TypingCommand::willAddTypingToOpenCommand via TypingCommand::deleteKeyPressed
</span></span></pre></div>
<a id="branchessafari612branchLayoutTestseditingcaretioscaretcolorinnestededitablecontainersexpectedtxt"></a>
<div class="addfile"><h4>Added: branches/safari-612-branch/LayoutTests/editing/caret/ios/caret-color-in-nested-editable-containers-expected.txt (0 => 285451)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-612-branch/LayoutTests/editing/caret/ios/caret-color-in-nested-editable-containers-expected.txt                          (rev 0)
+++ branches/safari-612-branch/LayoutTests/editing/caret/ios/caret-color-in-nested-editable-containers-expected.txt     2021-11-09 01:08:32 UTC (rev 285451)
</span><span class="lines">@@ -0,0 +1,11 @@
</span><ins>+
+This test verifies exercises the behavior of caret-color in nested editable containers. To manually run the test, focus the red box and verify that the caret color is red.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS caretColor is "rgb(255, 0, 0)"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="branchessafari612branchLayoutTestseditingcaretioscaretcolorinnestededitablecontainershtml"></a>
<div class="addfile"><h4>Added: branches/safari-612-branch/LayoutTests/editing/caret/ios/caret-color-in-nested-editable-containers.html (0 => 285451)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-612-branch/LayoutTests/editing/caret/ios/caret-color-in-nested-editable-containers.html                          (rev 0)
+++ branches/safari-612-branch/LayoutTests/editing/caret/ios/caret-color-in-nested-editable-containers.html     2021-11-09 01:08:32 UTC (rev 285451)
</span><span class="lines">@@ -0,0 +1,53 @@
</span><ins>+<!DOCTYPE html> <!-- webkit-test-runner [ useFlexibleViewport=true ] -->
+<html>
+<head>
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<script src="../../../resources/ui-helper.js"></script>
+<script src="../../../resources/js-test.js"></script>
+<style>
+body, html {
+    width: 100%;
+    height: 100%;
+    margin: 0;
+}
+
+#editor {
+    width: 250px;
+    font-size: 20px;
+    padding: 10px;
+    display: block;
+    border: 1px solid tomato;
+    caret-color: red;
+}
+</style>
+<script>
+jsTestIsAsync = true;
+
+addEventListener("load", async () => {
+    // FIXME: Once caret color follows the selection container's caret-color (bug #229809), this test should be
+    // rebaselined to verify that the caret background color is blue.
+    description("This test verifies exercises the behavior of <code>caret-color</code> in nested editable containers. To manually run the test, focus the red box and verify that the caret color is red.");
+
+    if (!window.testRunner)
+        return;
+
+    let editor = document.getElementById("editor");
+    await UIHelper.activateElementAndWaitForInputSession(editor);
+    await UIHelper.ensurePresentationUpdate();
+    caretColor = await UIHelper.selectionCaretBackgroundColor();
+
+    shouldBeEqualToString("caretColor", "rgb(255, 0, 0)");
+
+    editor.blur();
+    await UIHelper.waitForKeyboardToHide();
+    finishJSTest();
+});
+</script>
+</head>
+<body>
+<div contenteditable id="editor">
+    <div><br style="caret-color: blue;"></div>
+</div>
+<pre id="console"></pre>
+</body>
+</html>
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="branchessafari612branchSourceWebKitChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-612-branch/Source/WebKit/ChangeLog (285450 => 285451)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-612-branch/Source/WebKit/ChangeLog       2021-11-09 01:08:29 UTC (rev 285450)
+++ branches/safari-612-branch/Source/WebKit/ChangeLog  2021-11-09 01:08:32 UTC (rev 285451)
</span><span class="lines">@@ -1,3 +1,77 @@
</span><ins>+2021-11-08  Kocsen Chung  <kocsen_chung@apple.com>
+
+        Cherry-pick r281970. rdar://problem/85173043
+
+    REGRESSION (r280767): Caret color is black after pasting rich text in Mail compose in dark mode
+    https://bugs.webkit.org/show_bug.cgi?id=229808
+    rdar://82600990
+    
+    Reviewed by Tim Horton.
+    
+    Source/WebKit:
+    
+    Partially revert one of the changes in r280767 that makes caret-color follow the immediate container node of the
+    selection caret, rather than the focused element (which it previously used). This was effectively a drive-by fix
+    for a FIXME about allowing `caret-color` to match child containers inside the root editable container element.
+    While this matches behavior on macOS, this change also causes the caret color to become black when pasting rich
+    text copied in dark mode, since we write `caret-color: rgb(0, 0, 0);` to the pasteboard when copying the editing
+    style for rich text.
+    
+    In the short term, we should restore old (pre-r280767) `caret-color` on iOS; in the slightly longer term, I've
+    filed bug #229809 to track unifying macOS and iOS caret-color behavior, with respect to nested editable
+    container nodes.
+    
+    To retain the fix for rdar://81674787 without exhibiting the above bug, we use the selection's root editable
+    container (rather than `m_focusedElement`, which was used prior to r280767).
+    
+    Test: editing/caret/ios/caret-color-in-nested-editable-containers.html
+    
+    * WebProcess/WebPage/ios/WebPageIOS.mm:
+    (WebKit::WebPage::getPlatformEditorState const):
+    
+    Also adjust this logic so that we only attempt the tree-walk to find the root editable element if the selection
+    has editable style.
+    
+    LayoutTests:
+    
+    Add a test to exercise the behavior of different `caret-color` values in nested editable elements.
+    
+    * editing/caret/ios/caret-color-in-nested-editable-containers-expected.txt: Added.
+    * editing/caret/ios/caret-color-in-nested-editable-containers.html: Added.
+    
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@281970 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2021-09-02  Wenson Hsieh  <wenson_hsieh@apple.com>
+
+            REGRESSION (r280767): Caret color is black after pasting rich text in Mail compose in dark mode
+            https://bugs.webkit.org/show_bug.cgi?id=229808
+            rdar://82600990
+
+            Reviewed by Tim Horton.
+
+            Partially revert one of the changes in r280767 that makes caret-color follow the immediate container node of the
+            selection caret, rather than the focused element (which it previously used). This was effectively a drive-by fix
+            for a FIXME about allowing `caret-color` to match child containers inside the root editable container element.
+            While this matches behavior on macOS, this change also causes the caret color to become black when pasting rich
+            text copied in dark mode, since we write `caret-color: rgb(0, 0, 0);` to the pasteboard when copying the editing
+            style for rich text.
+
+            In the short term, we should restore old (pre-r280767) `caret-color` on iOS; in the slightly longer term, I've
+            filed bug #229809 to track unifying macOS and iOS caret-color behavior, with respect to nested editable
+            container nodes.
+
+            To retain the fix for rdar://81674787 without exhibiting the above bug, we use the selection's root editable
+            container (rather than `m_focusedElement`, which was used prior to r280767).
+
+            Test: editing/caret/ios/caret-color-in-nested-editable-containers.html
+
+            * WebProcess/WebPage/ios/WebPageIOS.mm:
+            (WebKit::WebPage::getPlatformEditorState const):
+
+            Also adjust this logic so that we only attempt the tree-walk to find the root editable element if the selection
+            has editable style.
+
</ins><span class="cx"> 2021-11-08  Alan Coon  <alancoon@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Apply patch. rdar://problem/83438282
</span></span></pre></div>
<a id="branchessafari612branchSourceWebKitWebProcessWebPageiosWebPageIOSmm"></a>
<div class="modfile"><h4>Modified: branches/safari-612-branch/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm (285450 => 285451)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-612-branch/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm    2021-11-09 01:08:29 UTC (rev 285450)
+++ branches/safari-612-branch/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm       2021-11-09 01:08:32 UTC (rev 285451)
</span><span class="lines">@@ -335,8 +335,13 @@
</span><span class="cx"> 
</span><span class="cx">     postLayoutData.insideFixedPosition = startNodeIsInsideFixedPosition || endNodeIsInsideFixedPosition;
</span><span class="cx">     if (!selection.isNone()) {
</span><del>-        if (RefPtr container = selection.start().containerNode(); container && container->renderer() && selection.isContentEditable())
-            postLayoutData.caretColor = CaretBase::computeCaretColor(container->renderer()->style(), container.get());
</del><ins>+        if (selection.hasEditableStyle()) {
+            // FIXME: The caret color style should be computed using the selection caret's container
+            // rather than the focused element. This causes caret colors in editable children to be
+            // ignored in favor of the editing host's caret color. See: <https://webkit.org/b/229809>.
+            if (RefPtr editableRoot = selection.rootEditableElement(); editableRoot && editableRoot->renderer())
+                postLayoutData.caretColor = CaretBase::computeCaretColor(editableRoot->renderer()->style(), editableRoot.get());
+        }
</ins><span class="cx"> 
</span><span class="cx">         if (auto editableRootOrFormControl = makeRefPtr(enclosingTextFormControl(selection.start()) ?: selection.rootEditableElement())) {
</span><span class="cx">             postLayoutData.selectionClipRect = rootViewInteractionBounds(*editableRootOrFormControl);
</span></span></pre>
</div>
</div>

</body>
</html>