[iOS][WK2] Use a better concept to describe the reason we defer zooming a focused...
authordbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 26 Mar 2019 22:08:52 +0000 (22:08 +0000)
committerdbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 26 Mar 2019 22:08:52 +0000 (22:08 +0000)
https://bugs.webkit.org/show_bug.cgi?id=196264

Reviewed by Wenson Hsieh.

Rename shouldDeferZoomingToSelectionWhenRevealingFocusedElement() to mayContainSelectableText() to describe
the criterion that we will use to decide whether to defer zooming or not. We defer zooming only for elements
that may support text selection on initial focus because we do not have an up-to-date selection rect at that
time. For element, like <select>, that do not support text selection, we can zoom them immediately when focused.

* UIProcess/ios/WKContentViewInteraction.mm:
(mayContainSelectableText): Renamed from shouldDeferZoomingToSelectionWhenRevealingFocusedElement.
List all the input types in the switch block and remove the default case to force the compiler to check that we
covered all cases. This will prevent unforseen keyboard issues (why isn't the keyboard shown? or why is the keyboard shown?)
for future input types that we may add.
(rectToRevealWhenZoomingToFocusedElement): Update for renaming.
(-[WKContentView _elementDidFocus:userIsInteracting:blurPreviousNode:changingActivityState:userObject:]): Add a
comment to explain why we may need to defer the zoom: the focused element supports text selection and we need
to wait for the web process to call back to provide an up-to-date selection rect for us to zoom and reveal.
(-[WKContentView _didReceiveEditorStateUpdateAfterFocus]): Update for renaming.
(shouldDeferZoomingToSelectionWhenRevealingFocusedElement): Deleted.

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

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

index 6e0f362..036594b 100644 (file)
@@ -1,3 +1,27 @@
+2019-03-26  Daniel Bates  <dabates@apple.com>
+
+        [iOS][WK2] Use a better concept to describe the reason we defer zooming a focused element: selectabiltiy
+        https://bugs.webkit.org/show_bug.cgi?id=196264
+
+        Reviewed by Wenson Hsieh.
+
+        Rename shouldDeferZoomingToSelectionWhenRevealingFocusedElement() to mayContainSelectableText() to describe
+        the criterion that we will use to decide whether to defer zooming or not. We defer zooming only for elements
+        that may support text selection on initial focus because we do not have an up-to-date selection rect at that
+        time. For element, like <select>, that do not support text selection, we can zoom them immediately when focused.
+
+        * UIProcess/ios/WKContentViewInteraction.mm:
+        (mayContainSelectableText): Renamed from shouldDeferZoomingToSelectionWhenRevealingFocusedElement.
+        List all the input types in the switch block and remove the default case to force the compiler to check that we
+        covered all cases. This will prevent unforseen keyboard issues (why isn't the keyboard shown? or why is the keyboard shown?)
+        for future input types that we may add.
+        (rectToRevealWhenZoomingToFocusedElement): Update for renaming.
+        (-[WKContentView _elementDidFocus:userIsInteracting:blurPreviousNode:changingActivityState:userObject:]): Add a
+        comment to explain why we may need to defer the zoom: the focused element supports text selection and we need
+        to wait for the web process to call back to provide an up-to-date selection rect for us to zoom and reveal.
+        (-[WKContentView _didReceiveEditorStateUpdateAfterFocus]): Update for renaming.
+        (shouldDeferZoomingToSelectionWhenRevealingFocusedElement): Deleted.
+
 2019-03-26  Wenson Hsieh  <wenson_hsieh@apple.com>
 
         Implement async paste method on UIWKInteractionViewProtocol
index b717358..461ffa9 100644 (file)
@@ -4812,22 +4812,36 @@ static NSString *contentTypeFromFieldName(WebCore::AutofillFieldName fieldName)
     return _focusedElementInformation.selectOptions;
 }
 
-static bool shouldDeferZoomingToSelectionWhenRevealingFocusedElement(WebKit::InputType type)
+// Note that selectability is also affected by the CSS property user-select.
+static bool mayContainSelectableText(WebKit::InputType type)
 {
     switch (type) {
+    case WebKit::InputType::None:
+    // The following types have custom UI and do not look or behave like a text field.
+#if ENABLE(INPUT_TYPE_COLOR)
+    case WebKit::InputType::Color:
+#endif
+    case WebKit::InputType::Date:
+    case WebKit::InputType::DateTimeLocal:
+    case WebKit::InputType::Drawing:
+    case WebKit::InputType::Month:
+    case WebKit::InputType::Select:
+    case WebKit::InputType::Time:
+        return false;
+    // The following types look and behave like a text field.
     case WebKit::InputType::ContentEditable:
-    case WebKit::InputType::Text:
-    case WebKit::InputType::Password:
-    case WebKit::InputType::TextArea:
-    case WebKit::InputType::Search:
+    case WebKit::InputType::DateTime:
     case WebKit::InputType::Email:
-    case WebKit::InputType::URL:
-    case WebKit::InputType::Phone:
     case WebKit::InputType::Number:
     case WebKit::InputType::NumberPad:
+    case WebKit::InputType::Password:
+    case WebKit::InputType::Phone:
+    case WebKit::InputType::Search:
+    case WebKit::InputType::Text:
+    case WebKit::InputType::TextArea:
+    case WebKit::InputType::URL:
+    case WebKit::InputType::Week:
         return true;
-    default:
-        return false;
     }
 }
 
@@ -4837,7 +4851,7 @@ static WebCore::FloatRect rectToRevealWhenZoomingToFocusedElement(const WebKit::
     if (elementInfo.elementRect.contains(elementInfo.lastInteractionLocation))
         elementInteractionRect = { elementInfo.lastInteractionLocation, { 1, 1 } };
 
-    if (!shouldDeferZoomingToSelectionWhenRevealingFocusedElement(elementInfo.elementType))
+    if (!mayContainSelectableText(elementInfo.elementType))
         return elementInteractionRect;
 
     if (editorState.isMissingPostLayoutData) {
@@ -4973,28 +4987,19 @@ static WebCore::FloatRect rectToRevealWhenZoomingToFocusedElement(const WebKit::
 #else
     [self reloadInputViews];
 #endif
-    
-    switch (information.elementType) {
-    case WebKit::InputType::Select:
-    case WebKit::InputType::DateTimeLocal:
-    case WebKit::InputType::Time:
-    case WebKit::InputType::Month:
-    case WebKit::InputType::Date:
-    case WebKit::InputType::Drawing:
-#if ENABLE(INPUT_TYPE_COLOR)
-    case WebKit::InputType::Color:
-#endif
-        break;
-    default:
+
+    if (mayContainSelectableText(_focusedElementInformation.elementType))
         [self _showKeyboard];
-        break;
-    }
-    
+
     // The custom fixed position rect behavior is affected by -isFocusingElement, so if that changes we need to recompute rects.
     if (editableChanged)
         [_webView _scheduleVisibleContentRectUpdate];
-    
-    if (!shouldDeferZoomingToSelectionWhenRevealingFocusedElement(_focusedElementInformation.elementType))
+
+    // For elements that have selectable content (e.g. text field) we need to wait for the web process to send an up-to-date
+    // selection rect before we can zoom and reveal the selection. Non-selectable elements (e.g. <select>) can be zoomed
+    // immediately because they have no selection to reveal.
+    BOOL needsEditorStateUpdate = mayContainSelectableText(_focusedElementInformation.elementType);
+    if (!needsEditorStateUpdate)
         [self _zoomToRevealFocusedElement];
 
     [self _updateAccessory];
@@ -5146,7 +5151,7 @@ static BOOL allPasteboardItemOriginsMatchOrigin(UIPasteboard *pasteboard, const
 
     // FIXME: If the initial writing direction just changed, we should wait until we get the next post-layout editor state
     // before zooming to reveal the selection rect.
-    if (shouldDeferZoomingToSelectionWhenRevealingFocusedElement(_focusedElementInformation.elementType))
+    if (mayContainSelectableText(_focusedElementInformation.elementType))
         [self _zoomToRevealFocusedElement];
 }