<!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>[174449] releases/WebKitGTK/webkit-2.6</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/174449">174449</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2014-10-08 06:20:33 -0700 (Wed, 08 Oct 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/174097">r174097</a> - Caret not shown at the end of line in overtype mode
https://bugs.webkit.org/show_bug.cgi?id=135508

Reviewed by Ryosuke Niwa.

Source/WebCore:

When overtype mode is enabled we usually replace the 'normal'
blinking caret shown in contenteditable elements by a block cursor
that covers the next character to be replaced. The exception is the
end of line where we fallback to the blinking caret even in overtype
mode (as there is no next character to replace).

We were not showing anything at the end of lines in overtype mode
because the detection of the end of line was incorrect and not very
understandable. Replaced the old code with a proper and clean end of
line detection mechanism compatible with bidi text.

Tests: editing/selection/block-cursor-overtype-mode-end-of-line-rtl.html
       editing/selection/block-cursor-overtype-mode-end-of-line.html

* editing/FrameSelection.cpp:
(WebCore::FrameSelection::updateAppearance):
* editing/VisibleUnits.cpp:
(WebCore::isLogicalEndOfLine):
* editing/VisibleUnits.h:

LayoutTests:

* editing/selection/block-cursor-overtype-mode-end-of-line-expected.html: Added.
* editing/selection/block-cursor-overtype-mode-end-of-line-rtl-expected.html: Added.
* editing/selection/block-cursor-overtype-mode-end-of-line-rtl.html: Added.
* editing/selection/block-cursor-overtype-mode-end-of-line.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit26LayoutTestsChangeLog">releases/WebKitGTK/webkit-2.6/LayoutTests/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit26SourceWebCoreChangeLog">releases/WebKitGTK/webkit-2.6/Source/WebCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit26SourceWebCoreeditingFrameSelectioncpp">releases/WebKitGTK/webkit-2.6/Source/WebCore/editing/FrameSelection.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit26SourceWebCoreeditingVisibleUnitscpp">releases/WebKitGTK/webkit-2.6/Source/WebCore/editing/VisibleUnits.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit26SourceWebCoreeditingVisibleUnitsh">releases/WebKitGTK/webkit-2.6/Source/WebCore/editing/VisibleUnits.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit26LayoutTestseditingselectionblockcursorovertypemodeendoflineexpectedhtml">releases/WebKitGTK/webkit-2.6/LayoutTests/editing/selection/block-cursor-overtype-mode-end-of-line-expected.html</a></li>
<li><a href="#releasesWebKitGTKwebkit26LayoutTestseditingselectionblockcursorovertypemodeendoflinertlexpectedhtml">releases/WebKitGTK/webkit-2.6/LayoutTests/editing/selection/block-cursor-overtype-mode-end-of-line-rtl-expected.html</a></li>
<li><a href="#releasesWebKitGTKwebkit26LayoutTestseditingselectionblockcursorovertypemodeendoflinertlhtml">releases/WebKitGTK/webkit-2.6/LayoutTests/editing/selection/block-cursor-overtype-mode-end-of-line-rtl.html</a></li>
<li><a href="#releasesWebKitGTKwebkit26LayoutTestseditingselectionblockcursorovertypemodeendoflinehtml">releases/WebKitGTK/webkit-2.6/LayoutTests/editing/selection/block-cursor-overtype-mode-end-of-line.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit26LayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.6/LayoutTests/ChangeLog (174448 => 174449)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.6/LayoutTests/ChangeLog        2014-10-08 13:19:26 UTC (rev 174448)
+++ releases/WebKitGTK/webkit-2.6/LayoutTests/ChangeLog        2014-10-08 13:20:33 UTC (rev 174449)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2014-08-01  Sergio Villar Senin  &lt;svillar@igalia.com&gt;
+
+        Caret not shown at the end of line in overtype mode
+        https://bugs.webkit.org/show_bug.cgi?id=135508
+
+        Reviewed by Ryosuke Niwa.
+
+        * editing/selection/block-cursor-overtype-mode-end-of-line-expected.html: Added.
+        * editing/selection/block-cursor-overtype-mode-end-of-line-rtl-expected.html: Added.
+        * editing/selection/block-cursor-overtype-mode-end-of-line-rtl.html: Added.
+        * editing/selection/block-cursor-overtype-mode-end-of-line.html: Added.
+
</ins><span class="cx"> 2014-09-29  David Hyatt  &lt;hyatt@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION (r168046): Confused column spans when combined with dynamic animations
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit26LayoutTestseditingselectionblockcursorovertypemodeendoflineexpectedhtml"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.6/LayoutTests/editing/selection/block-cursor-overtype-mode-end-of-line-expected.html (0 => 174449)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.6/LayoutTests/editing/selection/block-cursor-overtype-mode-end-of-line-expected.html                                (rev 0)
+++ releases/WebKitGTK/webkit-2.6/LayoutTests/editing/selection/block-cursor-overtype-mode-end-of-line-expected.html        2014-10-08 13:20:33 UTC (rev 174449)
</span><span class="lines">@@ -0,0 +1,15 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script&gt;
+function run() {
+    var element = (document.getElementById(&quot;editableContent&quot;)).firstChild;
+    getSelection().collapse(element, element.length);
+}
+&lt;/script&gt;
+&lt;/head&gt;
+&lt;body style = &quot;font: 30px;&quot; onload=&quot;run();&quot;&gt;
+    &lt;!-- We want to test block cursor appearance at the end of lines that aren't the end of the editable element. --&gt;
+    &lt;div id=&quot;editableContent&quot; contenteditable=&quot;true&quot;&gt;ABC&lt;br&gt;ABC&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit26LayoutTestseditingselectionblockcursorovertypemodeendoflinertlexpectedhtml"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.6/LayoutTests/editing/selection/block-cursor-overtype-mode-end-of-line-rtl-expected.html (0 => 174449)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.6/LayoutTests/editing/selection/block-cursor-overtype-mode-end-of-line-rtl-expected.html                                (rev 0)
+++ releases/WebKitGTK/webkit-2.6/LayoutTests/editing/selection/block-cursor-overtype-mode-end-of-line-rtl-expected.html        2014-10-08 13:20:33 UTC (rev 174449)
</span><span class="lines">@@ -0,0 +1,15 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script&gt;
+function run() {
+    var element = (document.getElementById(&quot;editableContent&quot;)).firstChild;
+    getSelection().collapse(element, element.length);
+}
+&lt;/script&gt;
+&lt;/head&gt;
+&lt;body style = &quot;font: 30px;&quot; onload=&quot;run();&quot;&gt;
+    &lt;!-- We want to test block cursor appearance at the end of lines that aren't the end of the editable element. --&gt;
+    &lt;div id=&quot;editableContent&quot; style=&quot;direction: rtl;&quot; contenteditable=&quot;true&quot;&gt;&amp;#x05e9;&amp;#x05d3;&amp;#x05df;ABC&lt;br&gt;ABC&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit26LayoutTestseditingselectionblockcursorovertypemodeendoflinertlhtml"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.6/LayoutTests/editing/selection/block-cursor-overtype-mode-end-of-line-rtl.html (0 => 174449)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.6/LayoutTests/editing/selection/block-cursor-overtype-mode-end-of-line-rtl.html                                (rev 0)
+++ releases/WebKitGTK/webkit-2.6/LayoutTests/editing/selection/block-cursor-overtype-mode-end-of-line-rtl.html        2014-10-08 13:20:33 UTC (rev 174449)
</span><span class="lines">@@ -0,0 +1,18 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script&gt;
+if (window.testRunner)
+    internals.toggleOverwriteModeEnabled(document);
+
+function run() {
+    var element = (document.getElementById(&quot;editableContent&quot;)).firstChild;
+    getSelection().collapse(element, element.length);
+}
+&lt;/script&gt;
+&lt;/head&gt;
+&lt;body style = &quot;font: 30px;&quot; onload=&quot;run();&quot;&quot;&gt;
+    &lt;!-- We want to test block cursor appearance at the end of lines that aren't the end of the editable element. --&gt;
+    &lt;div id=&quot;editableContent&quot; style=&quot;direction: rtl;&quot; contenteditable=&quot;true&quot;&gt;&amp;#x05e9;&amp;#x05d3;&amp;#x05df;ABC&lt;br&gt;ABC&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit26LayoutTestseditingselectionblockcursorovertypemodeendoflinehtml"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.6/LayoutTests/editing/selection/block-cursor-overtype-mode-end-of-line.html (0 => 174449)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.6/LayoutTests/editing/selection/block-cursor-overtype-mode-end-of-line.html                                (rev 0)
+++ releases/WebKitGTK/webkit-2.6/LayoutTests/editing/selection/block-cursor-overtype-mode-end-of-line.html        2014-10-08 13:20:33 UTC (rev 174449)
</span><span class="lines">@@ -0,0 +1,18 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script&gt;
+if (window.testRunner)
+    internals.toggleOverwriteModeEnabled(document);
+
+function run() {
+    var element = (document.getElementById(&quot;editableContent&quot;)).firstChild;
+    getSelection().collapse(element, element.length);
+}
+&lt;/script&gt;
+&lt;/head&gt;
+&lt;body style = &quot;font: 30px;&quot; onload=&quot;run();&quot;&quot;&gt;
+    &lt;!-- We want to test block cursor appearance at the end of lines that aren't the end of the editable element. --&gt;
+    &lt;div id=&quot;editableContent&quot; contenteditable=&quot;true&quot;&gt;ABC&lt;br&gt;ABC&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit26SourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.6/Source/WebCore/ChangeLog (174448 => 174449)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.6/Source/WebCore/ChangeLog        2014-10-08 13:19:26 UTC (rev 174448)
+++ releases/WebKitGTK/webkit-2.6/Source/WebCore/ChangeLog        2014-10-08 13:20:33 UTC (rev 174449)
</span><span class="lines">@@ -1,3 +1,30 @@
</span><ins>+2014-08-01  Sergio Villar Senin  &lt;svillar@igalia.com&gt;
+
+        Caret not shown at the end of line in overtype mode
+        https://bugs.webkit.org/show_bug.cgi?id=135508
+
+        Reviewed by Ryosuke Niwa.
+
+        When overtype mode is enabled we usually replace the 'normal'
+        blinking caret shown in contenteditable elements by a block cursor
+        that covers the next character to be replaced. The exception is the
+        end of line where we fallback to the blinking caret even in overtype
+        mode (as there is no next character to replace).
+
+        We were not showing anything at the end of lines in overtype mode
+        because the detection of the end of line was incorrect and not very
+        understandable. Replaced the old code with a proper and clean end of
+        line detection mechanism compatible with bidi text.
+
+        Tests: editing/selection/block-cursor-overtype-mode-end-of-line-rtl.html
+               editing/selection/block-cursor-overtype-mode-end-of-line.html
+
+        * editing/FrameSelection.cpp:
+        (WebCore::FrameSelection::updateAppearance):
+        * editing/VisibleUnits.cpp:
+        (WebCore::isLogicalEndOfLine):
+        * editing/VisibleUnits.h:
+
</ins><span class="cx"> 2014-09-29  David Hyatt  &lt;hyatt@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION (r168046): Confused column spans when combined with dynamic animations
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit26SourceWebCoreeditingFrameSelectioncpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.6/Source/WebCore/editing/FrameSelection.cpp (174448 => 174449)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.6/Source/WebCore/editing/FrameSelection.cpp        2014-10-08 13:19:26 UTC (rev 174448)
+++ releases/WebKitGTK/webkit-2.6/Source/WebCore/editing/FrameSelection.cpp        2014-10-08 13:20:33 UTC (rev 174449)
</span><span class="lines">@@ -1808,17 +1808,13 @@
</span><span class="cx">     // Paint a block cursor instead of a caret in overtype mode unless the caret is at the end of a line (in this case
</span><span class="cx">     // the FrameSelection will paint a blinking caret as usual).
</span><span class="cx">     VisibleSelection oldSelection = selection();
</span><del>-    VisiblePosition forwardPosition;
-    if (m_shouldShowBlockCursor &amp;&amp; oldSelection.isCaret()) {
-        forwardPosition = modifyExtendingForward(CharacterGranularity);
-        m_caretPaint = forwardPosition.isNull();
-    }
</del><span class="cx"> 
</span><span class="cx"> #if ENABLE(TEXT_CARET)
</span><ins>+    bool paintBlockCursor = m_shouldShowBlockCursor &amp;&amp; m_selection.isCaret() &amp;&amp; !isLogicalEndOfLine(m_selection.visibleEnd());
</ins><span class="cx">     bool caretRectChangedOrCleared = recomputeCaretRect();
</span><span class="cx"> 
</span><span class="cx">     bool caretBrowsing = m_frame-&gt;settings().caretBrowsingEnabled();
</span><del>-    bool shouldBlink = caretIsVisible() &amp;&amp; isCaret() &amp;&amp; (oldSelection.isContentEditable() || caretBrowsing) &amp;&amp; forwardPosition.isNull();
</del><ins>+    bool shouldBlink = !paintBlockCursor &amp;&amp; caretIsVisible() &amp;&amp; isCaret() &amp;&amp; (oldSelection.isContentEditable() || caretBrowsing);
</ins><span class="cx"> 
</span><span class="cx">     // If the caret moved, stop the blink timer so we can restart with a
</span><span class="cx">     // black caret in the new location.
</span><span class="lines">@@ -1844,7 +1840,12 @@
</span><span class="cx"> 
</span><span class="cx">     // Construct a new VisibleSolution, since m_selection is not necessarily valid, and the following steps
</span><span class="cx">     // assume a valid selection. See &lt;https://bugs.webkit.org/show_bug.cgi?id=69563&gt; and &lt;rdar://problem/10232866&gt;.
</span><del>-    VisibleSelection selection(oldSelection.visibleStart(), forwardPosition.isNotNull() ? forwardPosition : oldSelection.visibleEnd());
</del><ins>+#if ENABLE(TEXT_CARET)
+    VisiblePosition endVisiblePosition = paintBlockCursor ? modifyExtendingForward(CharacterGranularity) : oldSelection.visibleEnd();
+    VisibleSelection selection(oldSelection.visibleStart(), endVisiblePosition);
+#else
+    VisibleSelection selection(oldSelection.visibleStart(), oldSelection.visibleEnd());
+#endif
</ins><span class="cx"> 
</span><span class="cx">     if (!selection.isRange()) {
</span><span class="cx">         view-&gt;clearSelection();
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit26SourceWebCoreeditingVisibleUnitscpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.6/Source/WebCore/editing/VisibleUnits.cpp (174448 => 174449)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.6/Source/WebCore/editing/VisibleUnits.cpp        2014-10-08 13:19:26 UTC (rev 174448)
+++ releases/WebKitGTK/webkit-2.6/Source/WebCore/editing/VisibleUnits.cpp        2014-10-08 13:20:33 UTC (rev 174449)
</span><span class="lines">@@ -919,6 +919,11 @@
</span><span class="cx">     return p.isNotNull() &amp;&amp; p == endOfLine(p);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool isLogicalEndOfLine(const VisiblePosition &amp;p)
+{
+    return p.isNotNull() &amp;&amp; p == logicalEndOfLine(p);
+}
+
</ins><span class="cx"> static inline IntPoint absoluteLineDirectionPointToLocalPointInBlock(RootInlineBox&amp; root, int lineDirectionPoint)
</span><span class="cx"> {
</span><span class="cx">     RenderBlockFlow&amp; containingBlock = root.blockFlow();
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit26SourceWebCoreeditingVisibleUnitsh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.6/Source/WebCore/editing/VisibleUnits.h (174448 => 174449)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.6/Source/WebCore/editing/VisibleUnits.h        2014-10-08 13:19:26 UTC (rev 174448)
+++ releases/WebKitGTK/webkit-2.6/Source/WebCore/editing/VisibleUnits.h        2014-10-08 13:20:33 UTC (rev 174449)
</span><span class="lines">@@ -62,6 +62,7 @@
</span><span class="cx"> WEBCORE_EXPORT bool isEndOfLine(const VisiblePosition &amp;);
</span><span class="cx"> VisiblePosition logicalStartOfLine(const VisiblePosition &amp;);
</span><span class="cx"> VisiblePosition logicalEndOfLine(const VisiblePosition &amp;);
</span><ins>+bool isLogicalEndOfLine(const VisiblePosition &amp;);
</ins><span class="cx"> VisiblePosition leftBoundaryOfLine(const VisiblePosition&amp;, TextDirection);
</span><span class="cx"> VisiblePosition rightBoundaryOfLine(const VisiblePosition&amp;, TextDirection);
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>