<!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>[172395] trunk/Source/WebKit2</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/172395">172395</a></dd>
<dt>Author</dt> <dd>enrica@apple.com</dd>
<dt>Date</dt> <dd>2014-08-11 10:52:15 -0700 (Mon, 11 Aug 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Services with UI] Action menu arrow hit testing is sometimes wrong.
https://bugs.webkit.org/show_bug.cgi?id=135776
&lt;rdar://problem/17837670&gt;

Reviewed by Brady Eidson.

There was a problem in the algorithm that stitches together the selection rectangles
to be given to Data Detectors API.
This change adds a new function that stiches together all the rects contributing to the
first line, all the rects contributing to the last line and all the ones in the middle.
This way we can have a maximum of 3 non overlapping rectangles.

* WebProcess/WebPage/mac/ServicesOverlayController.mm:
(WebKit::stitchRects):
(WebKit::compactRectsWithGapRects):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagemacServicesOverlayControllermm">trunk/Source/WebKit2/WebProcess/WebPage/mac/ServicesOverlayController.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (172394 => 172395)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-08-11 10:40:00 UTC (rev 172394)
+++ trunk/Source/WebKit2/ChangeLog        2014-08-11 17:52:15 UTC (rev 172395)
</span><span class="lines">@@ -1,3 +1,21 @@
</span><ins>+2014-08-08  Enrica Casucci  &lt;enrica@apple.com&gt;
+
+        [Services with UI] Action menu arrow hit testing is sometimes wrong.
+        https://bugs.webkit.org/show_bug.cgi?id=135776
+        &lt;rdar://problem/17837670&gt;
+
+        Reviewed by Brady Eidson.
+
+        There was a problem in the algorithm that stitches together the selection rectangles
+        to be given to Data Detectors API.
+        This change adds a new function that stiches together all the rects contributing to the
+        first line, all the rects contributing to the last line and all the ones in the middle.
+        This way we can have a maximum of 3 non overlapping rectangles.
+
+        * WebProcess/WebPage/mac/ServicesOverlayController.mm:
+        (WebKit::stitchRects):
+        (WebKit::compactRectsWithGapRects):
+
</ins><span class="cx"> 2014-08-11  Gyuyoung Kim  &lt;gyuyoung.kim@samsung.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, EFL build fix since r172385.
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagemacServicesOverlayControllermm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/ServicesOverlayController.mm (172394 => 172395)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/mac/ServicesOverlayController.mm        2014-08-11 10:40:00 UTC (rev 172394)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/ServicesOverlayController.mm        2014-08-11 17:52:15 UTC (rev 172395)
</span><span class="lines">@@ -139,22 +139,59 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void compactRectsWithGapRects(Vector&lt;LayoutRect&gt;&amp; rects, const Vector&lt;GapRects&gt;&amp; gapRects)
</del><ins>+static inline void stitchRects(Vector&lt;LayoutRect&gt;&amp; rects)
</ins><span class="cx"> {
</span><del>-    if (rects.isEmpty())
</del><ins>+    if (rects.size() &lt;= 1)
</ins><span class="cx">         return;
</span><ins>+    
+    Vector&lt;LayoutRect&gt; newRects;
+    
+    // FIXME: Need to support vertical layout.
+    // First stitch together all the rects on the first line of the selection.
+    size_t indexFromStart = 0;
+    LayoutUnit firstTop = rects[indexFromStart].y();
+    LayoutRect&amp; currentRect = rects[indexFromStart++];
+    while (indexFromStart &lt; rects.size() &amp;&amp; rects[indexFromStart].y() == firstTop)
+        currentRect.unite(rects[indexFromStart++]);
+    
+    newRects.append(currentRect);
+    if (indexFromStart == rects.size()) {
+        // All the rects are on one line. There is nothing else to do.
+        rects.swap(newRects);
+        return;
+    }
+    
+    // Next stitch together all the rects on the last line of the selection.
+    size_t indexFromEnd = rects.size() - 1;
+    LayoutUnit lastTop = rects[indexFromEnd].y();
+    LayoutRect lastRect = rects[indexFromEnd];
+    while (indexFromEnd != indexFromStart &amp;&amp; rects[--indexFromEnd].y() == lastTop)
+        lastRect.unite(rects[indexFromEnd]);
+    
+    if (indexFromEnd == indexFromStart) {
+        // All the rects are on two lines only. There is nothing else to do.
+        newRects.append(lastRect);
+        rects.swap(newRects);
+        return;
+    }
+    
+    // indexFromStart is the index of the first rectangle on the second line.
+    // indexFromEnd is the index of the last rectangle on the second to the last line.
+    // Stitch together all the rects after the first line until the second to the last included.
+    currentRect = rects[indexFromStart];
+    while (indexFromStart != indexFromEnd)
+        currentRect.unite(rects[++indexFromStart]);
+    
+    newRects.append(currentRect);
+    newRects.append(lastRect);
</ins><span class="cx"> 
</span><del>-    // All of the middle rects - everything but the first and last - can be unioned together.
-    if (rects.size() &gt; 3) {
-        LayoutRect united;
-        for (unsigned i = 1; i &lt; rects.size() - 1; ++i)
-            united.unite(rects[i]);
</del><ins>+    rects.swap(newRects);
+}
</ins><span class="cx"> 
</span><del>-        rects[1] = united;
-        rects[2] = rects.last();
-        rects.shrink(3);
-    }
-
</del><ins>+static void compactRectsWithGapRects(Vector&lt;LayoutRect&gt;&amp; rects, const Vector&lt;GapRects&gt;&amp; gapRects)
+{
+    stitchRects(rects);
+    
</ins><span class="cx">     // FIXME: The following alignments are correct for LTR text.
</span><span class="cx">     // We should also account for RTL.
</span><span class="cx">     uint8_t alignments[3];
</span></span></pre>
</div>
</div>

</body>
</html>