Clicking on a data detected item inside a form control always pops up a map
authorbdakin@apple.com <bdakin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 25 Sep 2015 21:35:11 +0000 (21:35 +0000)
committerbdakin@apple.com <bdakin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 25 Sep 2015 21:35:11 +0000 (21:35 +0000)
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):

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

Source/WebCore/ChangeLog
Source/WebCore/editing/mac/DataDetection.mm
Source/WebKit2/ChangeLog
Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm

index efeb595..36b0859 100644 (file)
@@ -1,3 +1,24 @@
+2015-09-25  Beth Dakin  <bdakin@apple.com>
+
+        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):
+
 2015-09-25  Brady Eidson  <beidson@apple.com>
 
         PassRefPtr<> to RefPtr<> conversion in legacy IndexedDB code.
index 5eb68e6..3f13bbc 100644 (file)
@@ -30,6 +30,7 @@
 
 #import "DataDetectorsSPI.h"
 #import "FrameView.h"
+#import "HTMLTextFormControlElement.h"
 #import "HitTestResult.h"
 #import "Node.h"
 #import "Range.h"
 
 namespace WebCore {
 
-RetainPtr<DDActionContext> DataDetection::detectItemAroundHitTestResult(const HitTestResult& hitTestResult, FloatRect& detectedDataBoundingBox, RefPtr<Range>& detectedDataRange)
+static RetainPtr<DDActionContext> detectItemAtPositionWithRange(VisiblePosition position, RefPtr<Range> contextRange, FloatRect& detectedDataBoundingBox, RefPtr<Range>& detectedDataRange)
 {
-    if (!DataDetectorsLibrary())
-        return nullptr;
-
-    Node* node = hitTestResult.innerNonSharedNode();
-    if (!node)
-        return nullptr;
-    auto renderer = node->renderer();
-    if (!renderer)
-        return nullptr;
-    VisiblePosition position = renderer->positionForPoint(hitTestResult.localPoint(), nullptr);
-    if (position.isNull())
-        position = firstPositionInOrBeforeNode(node);
-
-    RefPtr<Range> contextRange = rangeExpandedAroundPositionByCharacters(position, 250);
-    if (!contextRange)
-        return nullptr;
-
     String fullPlainTextString = plainText(contextRange.get());
     int hitLocation = TextIterator::rangeLength(makeRange(contextRange->startPosition(), position).get());
 
@@ -104,6 +88,50 @@ RetainPtr<DDActionContext> DataDetection::detectItemAroundHitTestResult(const Hi
     return actionContext;
 }
 
+RetainPtr<DDActionContext> DataDetection::detectItemAroundHitTestResult(const HitTestResult& hitTestResult, FloatRect& detectedDataBoundingBox, RefPtr<Range>& detectedDataRange)
+{
+    if (!DataDetectorsLibrary())
+        return nullptr;
+
+    Node* node = hitTestResult.innerNonSharedNode();
+    if (!node)
+        return nullptr;
+    auto renderer = node->renderer();
+    if (!renderer)
+        return nullptr;
+
+    VisiblePosition position;
+    RefPtr<Range> contextRange;
+
+    if (!is<HTMLTextFormControlElement>(*node)) {
+        position = renderer->positionForPoint(hitTestResult.localPoint(), nullptr);
+        if (position.isNull())
+            position = firstPositionInOrBeforeNode(node);
+
+        contextRange = rangeExpandedAroundPositionByCharacters(position, 250);
+        if (!contextRange)
+            return nullptr;
+    } else {
+        Frame* frame = node->document().frame();
+        if (!frame)
+            return nullptr;
+
+        IntPoint framePoint = hitTestResult.roundedPointInInnerNodeFrame();
+        if (!frame->rangeForPoint(framePoint))
+            return nullptr;
+
+        VisiblePosition position = frame->visiblePositionForPoint(framePoint);
+        if (position.isNull())
+            return nullptr;
+
+        contextRange = enclosingTextUnitOfGranularity(position, LineGranularity, DirectionForward);
+        if (!contextRange)
+            return nullptr;
+    }
+
+    return detectItemAtPositionWithRange(position, contextRange, detectedDataBoundingBox, detectedDataRange);
+}
+
 } // namespace WebCore
 
 #endif // PLATFORM(MAC)
index f45aa7f..dfcffd8 100644 (file)
@@ -1,3 +1,19 @@
+2015-09-25  Beth Dakin  <bdakin@apple.com>
+
+        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):
+
 2015-09-25  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         [GTK] ASSERTION FAILED: !m_inUpdateBackingStoreState in DrawingAreaImpl::display() after DrawingAreaImpl::forceRepaint()
index 9b3e246..7692380 100644 (file)
@@ -1140,7 +1140,7 @@ void WebPage::performImmediateActionHitTestAtLocation(WebCore::FloatPoint locati
     }
 
     // FIXME: Avoid scanning if we will just throw away the result (e.g. we're over a link).
-    if (!pageOverlayDidOverrideDataDetectors && hitTestResult.innerNode() && hitTestResult.innerNode()->isTextNode()) {
+    if (!pageOverlayDidOverrideDataDetectors && hitTestResult.innerNode() && (hitTestResult.innerNode()->isTextNode() || hitTestResult.isOverTextInsideFormControlElement())) {
         FloatRect detectedDataBoundingBox;
         RefPtr<Range> detectedDataRange;
         immediateActionResult.detectedDataActionContext = DataDetection::detectItemAroundHitTestResult(hitTestResult, detectedDataBoundingBox, detectedDataRange);