[iOS] Do not paint tap highlight unless it is above a certain threshold
authorzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 31 Oct 2018 22:44:27 +0000 (22:44 +0000)
committerzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 31 Oct 2018 22:44:27 +0000 (22:44 +0000)
https://bugs.webkit.org/show_bug.cgi?id=191134
<rdar://problem/43615142>

Flashing a large portion of the screen on every tap looks unpleasant.
This patch impoves the existing heuristic by adding area check and a % threshold.

Reviewed by Tim Horton.

* UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView _showTapHighlight]):
(highlightedQuadsAreSmallerThanRect): Deleted.

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

Source/WebKit/ChangeLog
Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm

index c153cab..76e5dd8 100644 (file)
@@ -1,3 +1,18 @@
+2018-10-31  Zalan Bujtas  <zalan@apple.com>
+
+        [iOS] Do not paint tap highlight unless it is above a certain threshold
+        https://bugs.webkit.org/show_bug.cgi?id=191134
+        <rdar://problem/43615142>
+
+        Flashing a large portion of the screen on every tap looks unpleasant.
+        This patch impoves the existing heuristic by adding area check and a % threshold.  
+
+        Reviewed by Tim Horton.
+
+        * UIProcess/ios/WKContentViewInteraction.mm:
+        (-[WKContentView _showTapHighlight]):
+        (highlightedQuadsAreSmallerThanRect): Deleted.
+
 2018-10-31  Wenson Hsieh  <wenson_hsieh@apple.com>
 
         API test WKAttachmentTests.CopyAndPasteBetweenWebViews fails on macOS 10.13
index 4b8686d..e6e8632 100644 (file)
@@ -1151,16 +1151,6 @@ static FloatQuad inflateQuad(const FloatQuad& quad, float inflateSize)
 }
 #endif
 
-static inline bool highlightedQuadsAreSmallerThanRect(const Vector<FloatQuad>& quads, const FloatRect& rect)
-{
-    for (size_t i = 0; i < quads.size(); ++i) {
-        FloatRect boundingBox = quads[i].boundingBox();
-        if (boundingBox.width() > rect.width() || boundingBox.height() > rect.height())
-            return false;
-    }
-    return true;
-}
-
 static NSValue *nsSizeForTapHighlightBorderRadius(WebCore::IntSize borderRadius, CGFloat borderRadiusScale)
 {
     return [NSValue valueWithCGSize:CGSizeMake((borderRadius.width() * borderRadiusScale) + minimumTapHighlightRadius, (borderRadius.height() * borderRadiusScale) + minimumTapHighlightRadius)];
@@ -1223,7 +1213,19 @@ static NSValue *nsSizeForTapHighlightBorderRadius(WebCore::IntSize borderRadius,
 
 - (void)_showTapHighlight
 {
-    if (!highlightedQuadsAreSmallerThanRect(_tapHighlightInformation.quads, _page->unobscuredContentRect()) && !_showDebugTapHighlightsForFastClicking)
+    auto shouldPaintTapHighlight = [&](const FloatRect& rect) {
+        static const float highlightPaintThreshold = 0.3; // 30%
+        float highlightArea = 0;
+        for (auto highlightQuad : _tapHighlightInformation.quads) {
+            auto boundingBox = highlightQuad.boundingBox();
+            highlightArea += boundingBox.area(); 
+            if (boundingBox.width() > (rect.width() * highlightPaintThreshold) || boundingBox.height() > (rect.height() * highlightPaintThreshold))
+                return false;
+        }
+        return highlightArea < rect.area() * highlightPaintThreshold;
+    };
+
+    if (!shouldPaintTapHighlight(_page->unobscuredContentRect()) && !_showDebugTapHighlightsForFastClicking)
         return;
 
     if (!_highlightView) {