<!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>[190252] trunk/Source</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/190252">190252</a></dd>
<dt>Author</dt> <dd>bdakin@apple.com</dd>
<dt>Date</dt> <dd>2015-09-25 14:35:11 -0700 (Fri, 25 Sep 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Clicking on a data detected item inside a form control always pops up a map 
on force touch trackpad
https://bugs.webkit.org/show_bug.cgi?id=149559
-and corresponding-
rdar://problem/22826796

Reviewed by Tim Horton.

Source/WebCore:

The real bug here appears to be a bug in Lookup, but we can work around it. 
For normal text, we call directly into Data Detectors for map results, and 
that works fine. For text within form controls, we did not properly extract 
the text for DD, so we sent it to Lookup instead, and Lookup has this bug 
where they will pop open the map right away. If we properly extract the text 
for form controls, then we can work around this bug.

* editing/mac/DataDetection.mm:
(WebCore::detectItemAtPositionWithRange):
(WebCore::DataDetection::detectItemAroundHitTestResult):

Source/WebKit2:

Look for Data Detected text for text nodes and HitTestResults that are over 
text inside form controls.

* WebProcess/WebPage/mac/WebPageMac.mm:
(WebKit::WebPage::performImmediateActionHitTestAtLocation):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreeditingmacDataDetectionmm">trunk/Source/WebCore/editing/mac/DataDetection.mm</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagemacWebPageMacmm">trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (190251 => 190252)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-09-25 21:30:05 UTC (rev 190251)
+++ trunk/Source/WebCore/ChangeLog        2015-09-25 21:35:11 UTC (rev 190252)
</span><span class="lines">@@ -1,3 +1,24 @@
</span><ins>+2015-09-25  Beth Dakin  &lt;bdakin@apple.com&gt;
+
+        Clicking on a data detected item inside a form control always pops up a map 
+        on force touch trackpad
+        https://bugs.webkit.org/show_bug.cgi?id=149559
+        -and corresponding-
+        rdar://problem/22826796
+
+        Reviewed by Tim Horton.
+
+        The real bug here appears to be a bug in Lookup, but we can work around it. 
+        For normal text, we call directly into Data Detectors for map results, and 
+        that works fine. For text within form controls, we did not properly extract 
+        the text for DD, so we sent it to Lookup instead, and Lookup has this bug 
+        where they will pop open the map right away. If we properly extract the text 
+        for form controls, then we can work around this bug.
+
+        * editing/mac/DataDetection.mm:
+        (WebCore::detectItemAtPositionWithRange):
+        (WebCore::DataDetection::detectItemAroundHitTestResult):
+
</ins><span class="cx"> 2015-09-25  Brady Eidson  &lt;beidson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         PassRefPtr&lt;&gt; to RefPtr&lt;&gt; conversion in legacy IndexedDB code.
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingmacDataDetectionmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/mac/DataDetection.mm (190251 => 190252)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/mac/DataDetection.mm        2015-09-25 21:30:05 UTC (rev 190251)
+++ trunk/Source/WebCore/editing/mac/DataDetection.mm        2015-09-25 21:35:11 UTC (rev 190252)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> 
</span><span class="cx"> #import &quot;DataDetectorsSPI.h&quot;
</span><span class="cx"> #import &quot;FrameView.h&quot;
</span><ins>+#import &quot;HTMLTextFormControlElement.h&quot;
</ins><span class="cx"> #import &quot;HitTestResult.h&quot;
</span><span class="cx"> #import &quot;Node.h&quot;
</span><span class="cx"> #import &quot;Range.h&quot;
</span><span class="lines">@@ -41,25 +42,8 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-RetainPtr&lt;DDActionContext&gt; DataDetection::detectItemAroundHitTestResult(const HitTestResult&amp; hitTestResult, FloatRect&amp; detectedDataBoundingBox, RefPtr&lt;Range&gt;&amp; detectedDataRange)
</del><ins>+static RetainPtr&lt;DDActionContext&gt; detectItemAtPositionWithRange(VisiblePosition position, RefPtr&lt;Range&gt; contextRange, FloatRect&amp; detectedDataBoundingBox, RefPtr&lt;Range&gt;&amp; detectedDataRange)
</ins><span class="cx"> {
</span><del>-    if (!DataDetectorsLibrary())
-        return nullptr;
-
-    Node* node = hitTestResult.innerNonSharedNode();
-    if (!node)
-        return nullptr;
-    auto renderer = node-&gt;renderer();
-    if (!renderer)
-        return nullptr;
-    VisiblePosition position = renderer-&gt;positionForPoint(hitTestResult.localPoint(), nullptr);
-    if (position.isNull())
-        position = firstPositionInOrBeforeNode(node);
-
-    RefPtr&lt;Range&gt; contextRange = rangeExpandedAroundPositionByCharacters(position, 250);
-    if (!contextRange)
-        return nullptr;
-
</del><span class="cx">     String fullPlainTextString = plainText(contextRange.get());
</span><span class="cx">     int hitLocation = TextIterator::rangeLength(makeRange(contextRange-&gt;startPosition(), position).get());
</span><span class="cx"> 
</span><span class="lines">@@ -104,6 +88,50 @@
</span><span class="cx">     return actionContext;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+RetainPtr&lt;DDActionContext&gt; DataDetection::detectItemAroundHitTestResult(const HitTestResult&amp; hitTestResult, FloatRect&amp; detectedDataBoundingBox, RefPtr&lt;Range&gt;&amp; detectedDataRange)
+{
+    if (!DataDetectorsLibrary())
+        return nullptr;
+
+    Node* node = hitTestResult.innerNonSharedNode();
+    if (!node)
+        return nullptr;
+    auto renderer = node-&gt;renderer();
+    if (!renderer)
+        return nullptr;
+
+    VisiblePosition position;
+    RefPtr&lt;Range&gt; contextRange;
+
+    if (!is&lt;HTMLTextFormControlElement&gt;(*node)) {
+        position = renderer-&gt;positionForPoint(hitTestResult.localPoint(), nullptr);
+        if (position.isNull())
+            position = firstPositionInOrBeforeNode(node);
+
+        contextRange = rangeExpandedAroundPositionByCharacters(position, 250);
+        if (!contextRange)
+            return nullptr;
+    } else {
+        Frame* frame = node-&gt;document().frame();
+        if (!frame)
+            return nullptr;
+
+        IntPoint framePoint = hitTestResult.roundedPointInInnerNodeFrame();
+        if (!frame-&gt;rangeForPoint(framePoint))
+            return nullptr;
+
+        VisiblePosition position = frame-&gt;visiblePositionForPoint(framePoint);
+        if (position.isNull())
+            return nullptr;
+
+        contextRange = enclosingTextUnitOfGranularity(position, LineGranularity, DirectionForward);
+        if (!contextRange)
+            return nullptr;
+    }
+
+    return detectItemAtPositionWithRange(position, contextRange, detectedDataBoundingBox, detectedDataRange);
+}
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif // PLATFORM(MAC)
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (190251 => 190252)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-09-25 21:30:05 UTC (rev 190251)
+++ trunk/Source/WebKit2/ChangeLog        2015-09-25 21:35:11 UTC (rev 190252)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2015-09-25  Beth Dakin  &lt;bdakin@apple.com&gt;
+
+        Clicking on a data detected item inside a form control always pops up a map 
+        on force touch trackpad
+        https://bugs.webkit.org/show_bug.cgi?id=149559
+        -and corresponding-
+        rdar://problem/22826796
+
+        Reviewed by Tim Horton.
+
+        Look for Data Detected text for text nodes and HitTestResults that are over 
+        text inside form controls.
+
+        * WebProcess/WebPage/mac/WebPageMac.mm:
+        (WebKit::WebPage::performImmediateActionHitTestAtLocation):
+
</ins><span class="cx"> 2015-09-25  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] ASSERTION FAILED: !m_inUpdateBackingStoreState in DrawingAreaImpl::display() after DrawingAreaImpl::forceRepaint()
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagemacWebPageMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm (190251 => 190252)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm        2015-09-25 21:30:05 UTC (rev 190251)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm        2015-09-25 21:35:11 UTC (rev 190252)
</span><span class="lines">@@ -1140,7 +1140,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // FIXME: Avoid scanning if we will just throw away the result (e.g. we're over a link).
</span><del>-    if (!pageOverlayDidOverrideDataDetectors &amp;&amp; hitTestResult.innerNode() &amp;&amp; hitTestResult.innerNode()-&gt;isTextNode()) {
</del><ins>+    if (!pageOverlayDidOverrideDataDetectors &amp;&amp; hitTestResult.innerNode() &amp;&amp; (hitTestResult.innerNode()-&gt;isTextNode() || hitTestResult.isOverTextInsideFormControlElement())) {
</ins><span class="cx">         FloatRect detectedDataBoundingBox;
</span><span class="cx">         RefPtr&lt;Range&gt; detectedDataRange;
</span><span class="cx">         immediateActionResult.detectedDataActionContext = DataDetection::detectItemAroundHitTestResult(hitTestResult, detectedDataBoundingBox, detectedDataRange);
</span></span></pre>
</div>
</div>

</body>
</html>